summaryrefslogtreecommitdiff
path: root/ports_module/cortex_m3
diff options
context:
space:
mode:
authorYuxin Zhou <[email protected]>2021-07-28 07:24:02 +0000
committerYuxin Zhou <[email protected]>2021-07-28 07:24:02 +0000
commitd0dab582506f132690b35b36ffea129ad51110b0 (patch)
tree13add80dd314dc38efc1830f3d1f36b5a2596e98 /ports_module/cortex_m3
parent244365fc6a937c754cfc6bb8e6895dc6f37bac0e (diff)
Release 6.1.8v6.1.8_rel
Diffstat (limited to 'ports_module/cortex_m3')
-rw-r--r--ports_module/cortex_m3/ac5/example_build/tx_initialize_low_level.S2
-rw-r--r--ports_module/cortex_m3/ac5/inc/txm_module_port.h22
-rw-r--r--ports_module/cortex_m3/ac5/module_lib/src/txm_module_initialize.S159
-rw-r--r--ports_module/cortex_m3/ac5/module_lib/src/txm_module_thread_shell_entry.c2
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_restore.S156
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_save.S160
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_control.S145
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_disable.S138
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_restore.S137
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_thread_schedule.S875
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_thread_stack_build.S256
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_thread_system_return.S166
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/tx_timer_interrupt.S453
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_alignment_adjust.c4
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_external_memory_enable.c2
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_handler.c2
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_notify.c2
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_mm_register_setup.c6
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_thread_stack_build.S265
-rw-r--r--ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_user_mode_entry.S146
-rw-r--r--ports_module/cortex_m3/ac6/inc/txm_module_port.h39
-rw-r--r--ports_module/cortex_m3/ac6/module_lib/src/txm_module_initialize.S3
-rw-r--r--ports_module/cortex_m3/ac6/module_lib/src/txm_module_thread_shell_entry.c8
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_restore.S26
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_save.S28
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/tx_thread_interrupt_control.S29
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/tx_thread_schedule.S103
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/tx_thread_stack_build.S12
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/tx_thread_system_return.S17
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/tx_timer_interrupt.S37
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_alignment_adjust.c4
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_external_memory_enable.c2
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_handler.c2
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_notify.c2
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_mm_register_setup.c6
-rw-r--r--ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_thread_stack_build.S10
-rw-r--r--ports_module/cortex_m3/gnu/example_build/build_threadx_module_library.bat194
-rw-r--r--ports_module/cortex_m3/gnu/example_build/build_threadx_module_sample.bat6
-rw-r--r--ports_module/cortex_m3/gnu/example_build/sample_threadx_module.ld6
-rw-r--r--ports_module/cortex_m3/gnu/inc/txm_module_port.h15
-rw-r--r--ports_module/cortex_m3/gnu/module_lib/src/txm_module_thread_shell_entry.c2
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_restore.S155
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_save.S147
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/tx_thread_interrupt_control.S142
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/tx_thread_schedule.S90
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/tx_thread_stack_build.S256
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/tx_thread_system_return.S163
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/tx_timer_interrupt.S475
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_alignment_adjust.c4
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_external_memory_enable.c2
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_handler.c2
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_notify.c2
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_mm_register_setup.c6
-rw-r--r--ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_thread_stack_build.s10
-rw-r--r--ports_module/cortex_m3/iar/inc/txm_module_port.h19
-rw-r--r--ports_module/cortex_m3/iar/module_lib/src/txm_module_thread_shell_entry.c2
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_misra.s73
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_restore.s149
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_save.s151
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_control.s145
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_disable.s138
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_restore.s136
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_thread_schedule.s855
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_thread_stack_build.s256
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_thread_system_return.s167
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/tx_timer_interrupt.s452
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_alignment_adjust.c4
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_external_memory_enable.c2
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_handler.c2
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_notify.c2
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_mm_register_setup.c6
-rw-r--r--ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_thread_stack_build.s265
72 files changed, 3971 insertions, 3956 deletions
diff --git a/ports_module/cortex_m3/ac5/example_build/tx_initialize_low_level.S b/ports_module/cortex_m3/ac5/example_build/tx_initialize_low_level.S
index 246c7010..a3ae9835 100644
--- a/ports_module/cortex_m3/ac5/example_build/tx_initialize_low_level.S
+++ b/ports_module/cortex_m3/ac5/example_build/tx_initialize_low_level.S
@@ -150,7 +150,7 @@ Reset_Handler
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
-;/* 09-30-2020 Scott Larson Initial Version 6.1 */
+;/* 09-30-2020 Scott Larson Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_initialize_low_level(VOID)
diff --git a/ports_module/cortex_m3/ac5/inc/txm_module_port.h b/ports_module/cortex_m3/ac5/inc/txm_module_port.h
index 667db1e4..9c2bda5a 100644
--- a/ports_module/cortex_m3/ac5/inc/txm_module_port.h
+++ b/ports_module/cortex_m3/ac5/inc/txm_module_port.h
@@ -104,16 +104,6 @@ The following extensions must also be defined in tx_port.h:
#define TXM_MODULE_KERNEL_STACK_SIZE 768
#endif
-/* For the following 3 access control settings, change TEX and C, B, S (bits 21 through 16 of MPU_RASR)
- * to reflect your system memory attributes (cache, shareable, memory type). */
-/* Code region access control: privileged read-only, outer & inner write-back, normal memory, shareable. */
-#define TXM_MODULE_MPU_CODE_ACCESS_CONTROL 0x06070000
-/* Data region access control: execute never, read/write, outer & inner write-back, normal memory, shareable. */
-#define TXM_MODULE_MPU_DATA_ACCESS_CONTROL 0x13070000
-/* Shared region access control: execute never, read-only, outer & inner write-back, normal memory, shareable. */
-#define TXM_MODULE_MPU_SHARED_ACCESS_CONTROL 0x12070000
-
-
/* Define constants specific to the tools the module can be built with for this particular modules port. */
#define TXM_MODULE_IAR_COMPILER 0x00000000
@@ -164,13 +154,13 @@ The following extensions must also be defined in tx_port.h:
/* Define other module port-specific constants. */
-/* Define INLINE_DECLARE to inline for ARM compiler. */
+/* Define INLINE_DECLARE to inline for AC5 compiler. */
#define INLINE_DECLARE inline
-/* Define the number of MPU entries assigned to the code and data sections. On Cortex-M parts, there can only be 7 total
- entries, since ThreadX uses one for access to the kernel dispatch function. */
-
+/* Define the number of MPU entries assigned to the code and data sections.
+ On Cortex-M3 parts, there are 8 total entries. ThreadX uses one for access
+ to the kernel entry function, thus 7 remain for code and data protection. */
#define TXM_MODULE_MANAGER_CODE_MPU_ENTRIES 4
#define TXM_MODULE_MANAGER_DATA_MPU_ENTRIES 3
#define TXM_MODULE_MANAGER_SHARED_MPU_INDEX 8
@@ -337,7 +327,7 @@ ULONG _txm_module_manager_calculate_srd_bits(ULONG block_size, ULONG length);
ULONG _txm_module_manager_region_size_get(ULONG block_size);
#define TXM_MODULE_MANAGER_VERSION_ID \
-CHAR _txm_module_manager_version_id[] = \
- "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M3/MPU/AC5 Version 6.1 *";
+CHAR _txm_module_manager_version_id[] = \
+ "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M3/MPU/AC5 Version 6.1.8 *";
#endif
diff --git a/ports_module/cortex_m3/ac5/module_lib/src/txm_module_initialize.S b/ports_module/cortex_m3/ac5/module_lib/src/txm_module_initialize.S
index 80137e06..46343731 100644
--- a/ports_module/cortex_m3/ac5/module_lib/src/txm_module_initialize.S
+++ b/ports_module/cortex_m3/ac5/module_lib/src/txm_module_initialize.S
@@ -1,97 +1,94 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Module */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Module */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
IMPORT __use_two_region_memory
IMPORT __scatterload
IMPORT txm_heap
AREA ||.text||, CODE, READONLY
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _txm_module_initialize Cortex-M3/MPU/AC5 */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* Scott Larson, Microsoft Corporation */
-;/* */
-;/* DESCRIPTION */
-;/* */
-;/* This function initializes the module c runtime. */
-;/* */
-;/* INPUT */
-;/* */
-;/* None */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* __scatterload Initialize C runtime */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* _txm_module_thread_shell_entry Start module thread */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
-;/* DATE NAME DESCRIPTION */
-;/* */
-;/* 09-30-2020 Scott Larson Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _txm_module_initialize(VOID)
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _txm_module_initialize Cortex-M3/MPU/AC5 */
+/* 6.1 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function initializes the module c runtime. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* __scatterload Initialize C runtime */
+/* */
+/* CALLED BY */
+/* */
+/* _txm_module_thread_shell_entry Start module thread */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* */
+/**************************************************************************/
+// VOID _txm_module_initialize(VOID)
EXPORT _txm_module_initialize
_txm_module_initialize
- PUSH {r4-r12,lr} ; Save dregs and LR
+ PUSH {r4-r12,lr} // Save dregs and LR
+
+ B __scatterload // Call ARM func to initialize variables
- B __scatterload ; Call ARM func to initialize variables
-;
-;/* Override __rt_exit function. */
-;
+/* Override __rt_exit function. */
+
EXPORT __rt_exit
__rt_exit
- POP {r4-r12,lr} ; Restore dregs and LR
- BX lr ; Return to caller
-;
-;
-;
+ POP {r4-r12,lr} // Restore dregs and LR
+ BX lr // Return to caller
+
EXPORT __user_setup_stackheap
- ; returns heap start address in R0
- ; returns heap end address in R2
- ; does not touch SP, it is already set up before the module runs
+ // returns heap start address in R0
+ // returns heap end address in R2
+ // does not touch SP, it is already set up before the module runs
__user_setup_stackheap
- LDR r1, _tx_heap_offset ; load heap offset
- ADD r0, r9, r1 ; calculate heap base address
- MOV r2, #TXM_MODULE_HEAP_SIZE ; load heap size
- ADD r2, r2, r0 ; calculate heap end address
+ LDR r1, _tx_heap_offset // load heap offset
+ ADD r0, r9, r1 // calculate heap base address
+ MOV r2, #TXM_MODULE_HEAP_SIZE // load heap size
+ ADD r2, r2, r0 // calculate heap end address
BX lr
ALIGN 4
@@ -101,9 +98,9 @@ _tx_heap_offset
IMPORT txm_heap [DATA]
-;
-; Dummy main function
-;
+
+// Dummy main function
+
AREA section_main, CODE, READONLY, ALIGN=2
EXPORT main
main
diff --git a/ports_module/cortex_m3/ac5/module_lib/src/txm_module_thread_shell_entry.c b/ports_module/cortex_m3/ac5/module_lib/src/txm_module_thread_shell_entry.c
index fdd17ff4..0dc4f51e 100644
--- a/ports_module/cortex_m3/ac5/module_lib/src/txm_module_thread_shell_entry.c
+++ b/ports_module/cortex_m3/ac5/module_lib/src/txm_module_thread_shell_entry.c
@@ -90,7 +90,7 @@ __align(8) UCHAR txm_heap[TXM_MODULE_HEAP_SIZE];
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_thread_shell_entry(TX_THREAD *thread_ptr, TXM_MODULE_THREAD_ENTRY_INFO *thread_info)
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_restore.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_restore.S
index 14b1da0e..1159ea66 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_restore.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_restore.S
@@ -1,91 +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 */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
- IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
IMPORT _tx_execution_isr_exit
- ENDIF
-;
-;
+#endif
+
AREA ||.text||, CODE, READONLY
PRESERVE8
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_context_restore Cortex-M3/AC5 */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* William E. Lamie, Microsoft Corporation */
-;/* */
-;/* DESCRIPTION */
-;/* */
-;/* This function is only needed for legacy applications and it should */
-;/* not be called in any new development on a Cortex-M. */
-;/* 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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_context_restore(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_context_restore Cortex-Mx/AC5 */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is only needed for legacy applications and it should */
+/* not be called in any new development on a Cortex-M. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* [_tx_execution_isr_exit] Execution profiling ISR exit */
+/* */
+/* CALLED BY */
+/* */
+/* ISRs Interrupt Service Routines */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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}
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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} // Recover return address
+#endif
+
BX lr
-;}
+// }
ALIGN
LTORG
END
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_save.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_save.S
index ae21c768..d8ee75a4 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_save.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_context_save.S
@@ -1,91 +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 */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
- IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
IMPORT _tx_execution_isr_enter
- ENDIF
-;
-;
+#endif
+
AREA ||.text||, CODE, READONLY
PRESERVE8
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_context_save Cortex-M3/AC5 */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* William E. Lamie, Microsoft Corporation */
-;/* */
-;/* DESCRIPTION */
-;/* */
-;/* This function is only needed for legacy applications and it should */
-;/* not be called in any new development on a Cortex-M. */
-;/* 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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_context_save(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_context_save Cortex-Mx/AC5 */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is only needed for legacy applications and it should */
+/* not be called in any new development on a Cortex-M. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* [_tx_execution_isr_enter] Execution profiling ISR enter */
+/* */
+/* CALLED BY */
+/* */
+/* ISRs */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
-;}
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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
+// }
ALIGN
LTORG
END
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_control.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_control.S
index 3c0f1768..4c5e1c33 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_control.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_control.S
@@ -1,76 +1,77 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
AREA ||.text||, CODE, READONLY
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_interrupt_control Cortex-M3/AC5 */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;UINT _tx_thread_interrupt_control(UINT new_posture)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_interrupt_control Cortex-Mx/AC5 */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
-;
-;}
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r1, BASEPRI // Pickup current interrupt posture
+ MSR BASEPRI, r0 // Apply the new interrupt posture
+ MOV r0, r1 // Transfer old to return register
+#else
+ MRS r1, PRIMASK // Pickup current interrupt lockout
+ MSR PRIMASK, r0 // Apply the new interrupt lockout
+ MOV r0, r1 // Transfer old to return register
+#endif
+ BX lr // Return to caller
+// }
END
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_disable.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_disable.S
index d66a11f0..88e6a864 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_disable.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_disable.S
@@ -1,75 +1,77 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
AREA ||.text||, CODE, READONLY
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_interrupt_disable Cortex-M3/AC5 */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;UINT _tx_thread_interrupt_disable(UINT new_posture)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_interrupt_disable Cortex-Mx/AC5 */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is responsible for disabling interrupts and returning */
+/* the previous interrupt lockout posture. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* old_posture Old interrupt lockout posture */
+/* */
+/* CALLS */
+/* */
+/* None */
+/* */
+/* CALLED BY */
+/* */
+/* Application Code */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// UINT _tx_thread_interrupt_disable(VOID)
+// {
EXPORT _tx_thread_interrupt_disable
_tx_thread_interrupt_disable
-;
-; /* Return current interrupt lockout posture. */
-;
+ /* Return current interrupt lockout posture. */
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r0, BASEPRI
+ LDR r1, =TX_PORT_BASEPRI
+ MSR BASEPRI, r1
+#else
MRS r0, PRIMASK
CPSID i
+#endif
BX lr
-;
-;}
+// }
END
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_restore.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_restore.S
index df65a539..22340c21 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_restore.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_interrupt_restore.S
@@ -1,74 +1,75 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
AREA ||.text||, CODE, READONLY
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_interrupt_restore Cortex-M3/AC5 */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_interrupt_restore(UINT new_posture)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_interrupt_restore Cortex-Mx/AC5 */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is responsible for restoring the previous */
+/* interrupt lockout posture. */
+/* */
+/* INPUT */
+/* */
+/* previous_posture Previous interrupt posture */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* None */
+/* */
+/* CALLED BY */
+/* */
+/* Application Code */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// VOID _tx_thread_interrupt_restore(UINT previous_posture)
+// {
EXPORT _tx_thread_interrupt_restore
_tx_thread_interrupt_restore
-;
-; /* Restore previous interrupt lockout posture. */
-;
+
+ /* Restore previous interrupt lockout posture. */
+#ifdef TX_PORT_USE_BASEPRI
+ MSR BASEPRI, r0
+#else
MSR PRIMASK, r0
+#endif
BX lr
-;
-;}
+// }
END
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_schedule.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_schedule.S
index 4194d69c..a749235a 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_schedule.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_schedule.S
@@ -1,519 +1,494 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
IMPORT _tx_thread_current_ptr
IMPORT _tx_thread_execute_ptr
IMPORT _tx_timer_time_slice
IMPORT _tx_thread_system_stack_ptr
- IF :DEF: TX_ENABLE_EXECUTION_CHANGE_NOTIFY
+ IMPORT _tx_thread_preempt_disable
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
IMPORT _tx_execution_thread_enter
IMPORT _tx_execution_thread_exit
- ENDIF
- IMPORT _tx_thread_preempt_disable
+#endif
IMPORT _txm_module_manager_memory_fault_handler
IMPORT _txm_module_manager_memory_fault_info
- IMPORT _txm_module_priv
- IMPORT _txm_module_user_mode_exit
-;
-;
+ IMPORT _txm_module_priv
+ IMPORT _txm_module_user_mode_exit
+
AREA ||.text||, CODE, READONLY
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_schedule Cortex-M3/MPU/AC5 */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* Scott Larson, 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 */
-;/* */
-;/* 09-30-2020 Scott Larson Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_schedule(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_schedule Cortex-M3/MPU/AC5 */
+/* 6.1 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 09-30-2020 Scott Larson Initial Version 6.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 FPU registers aren't unnecessarily stacked. */
-;
- IF :DEF: __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 memory fault registers. */
-;
- LDR r0, =0xE000ED24 ; Build SHCSR address
- LDR r1, =0x70000 ; Enable Usage, Bus, and MemManage faults
- STR r1, [r0] ;
-;
-; /* Enable interrupts */
-;
+
+ /* This function should only ever be called on Cortex-M
+ from the first schedule request. Subsequent scheduling occurs
+ from the PendSV handling routine 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 memory fault registers. */
+ LDR r0, =0xE000ED24 // Build SHCSR address
+ LDR r1, =0x70000 // Enable Usage, Bus, and MemManage faults
+ STR r1, [r0] //
+
+ /* 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. */
+ /* 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
-;}
-;
+ B __tx_wait_here // Wait for the PendSV to happen
+// }
+
+
+ /* Memory Exception Handler. */
-;
-; /* Memory Exception Handler. */
-;
EXPORT MemManage_Handler
MemManage_Handler
-;{
- CPSID i ; Disable interrupts
-;
-; /* Now pickup and store all the fault related information. */
-;
- LDR r12,=_txm_module_manager_memory_fault_info ; Pickup fault info struct
- LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r1, [r0] ; Pickup the current thread pointer
- STR r1, [r12, #0] ; Save current thread pointer in fault info structure
- LDR r0, =0xE000ED24 ; Build SHCSR address
- LDR r1, [r0] ; Pickup SHCSR
- STR r1, [r12, #8] ; Save SHCSR
- LDR r0, =0xE000ED28 ; Build CFSR address
- LDR r1, [r0] ; Pickup CFSR
- STR r1, [r12, #12] ; Save CFSR
- LDR r0, =0xE000ED34 ; Build MMFAR address
- LDR r1, [r0] ; Pickup MMFAR
- STR r1, [r12, #16] ; Save MMFAR
- LDR r0, =0xE000ED38 ; Build BFAR address
- LDR r1, [r0] ; Pickup BFAR
- STR r1, [r12, #20] ; Save BFAR
- MRS r0, CONTROL ; Pickup current CONTROL register
- STR r0, [r12, #24] ; Save CONTROL
- MRS r1, PSP ; Pickup thread stack pointer
- STR r1, [r12, #28] ; Save thread stack pointer
- LDR r0, [r1] ; Pickup saved r0
- STR r0, [r12, #32] ; Save r0
- LDR r0, [r1, #4] ; Pickup saved r1
- STR r0, [r12, #36] ; Save r1
- STR r2, [r12, #40] ; Save r2
- STR r3, [r12, #44] ; Save r3
- STR r4, [r12, #48] ; Save r4
- STR r5, [r12, #52] ; Save r5
- STR r6, [r12, #56] ; Save r6
- STR r7, [r12, #60] ; Save r7
- STR r8, [r12, #64] ; Save r8
- STR r9, [r12, #68] ; Save r9
- STR r10,[r12, #72] ; Save r10
- STR r11,[r12, #76] ; Save r11
- LDR r0, [r1, #16] ; Pickup saved r12
- STR r0, [r12, #80] ; Save r12
- LDR r0, [r1, #20] ; Pickup saved lr
- STR r0, [r12, #84] ; Save lr
- LDR r0, [r1, #24] ; Pickup instruction address at point of fault
- STR r0, [r12, #4] ; Save point of fault
- LDR r0, [r1, #28] ; Pickup xPSR
- STR r0, [r12, #88] ; Save xPSR
+ CPSID i // Disable interrupts
+
+ /* Now pickup and store all the fault related information. */
- MRS r0, CONTROL ; Pickup current CONTROL register
- BIC r0, r0, #1 ; Clear the UNPRIV bit
- MSR CONTROL, r0 ; Setup new CONTROL register
+ LDR r12,=_txm_module_manager_memory_fault_info // Pickup fault info struct
+ LDR r0, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r1, [r0] // Pickup the current thread pointer
+ STR r1, [r12, #0] // Save current thread pointer in fault info structure
+ LDR r0, =0xE000ED24 // Build SHCSR address
+ LDR r1, [r0] // Pickup SHCSR
+ STR r1, [r12, #8] // Save SHCSR
+ LDR r0, =0xE000ED28 // Build CFSR address
+ LDR r1, [r0] // Pickup CFSR
+ STR r1, [r12, #12] // Save CFSR
+ LDR r0, =0xE000ED34 // Build MMFAR address
+ LDR r1, [r0] // Pickup MMFAR
+ STR r1, [r12, #16] // Save MMFAR
+ LDR r0, =0xE000ED38 // Build BFAR address
+ LDR r1, [r0] // Pickup BFAR
+ STR r1, [r12, #20] // Save BFAR
+ MRS r0, CONTROL // Pickup current CONTROL register
+ STR r0, [r12, #24] // Save CONTROL
+ MRS r1, PSP // Pickup thread stack pointer
+ STR r1, [r12, #28] // Save thread stack pointer
+ LDR r0, [r1] // Pickup saved r0
+ STR r0, [r12, #32] // Save r0
+ LDR r0, [r1, #4] // Pickup saved r1
+ STR r0, [r12, #36] // Save r1
+ STR r2, [r12, #40] // Save r2
+ STR r3, [r12, #44] // Save r3
+ STR r4, [r12, #48] // Save r4
+ STR r5, [r12, #52] // Save r5
+ STR r6, [r12, #56] // Save r6
+ STR r7, [r12, #60] // Save r7
+ STR r8, [r12, #64] // Save r8
+ STR r9, [r12, #68] // Save r9
+ STR r10,[r12, #72] // Save r10
+ STR r11,[r12, #76] // Save r11
+ LDR r0, [r1, #16] // Pickup saved r12
+ STR r0, [r12, #80] // Save r12
+ LDR r0, [r1, #20] // Pickup saved lr
+ STR r0, [r12, #84] // Save lr
+ LDR r0, [r1, #24] // Pickup instruction address at point of fault
+ STR r0, [r12, #4] // Save point of fault
+ LDR r0, [r1, #28] // Pickup xPSR
+ STR r0, [r12, #88] // Save xPSR
- LDR r0, =0xE000ED28 ; Build the Memory Management Fault Status Register (MMFSR)
- LDRB r1, [r0] ; Pickup the MMFSR, with the following bit definitions:
- ; Bit 0 = 1 -> Instruction address violation
- ; Bit 1 = 1 -> Load/store address violation
- ; Bit 7 = 1 -> MMFAR is valid
- STRB r1, [r0] ; Clear the MMFSR
+ MRS r0, CONTROL // Pickup current CONTROL register
+ BIC r0, r0, #1 // Clear the UNPRIV bit
+ MSR CONTROL, r0 // Setup new CONTROL register
- IF :DEF: __ARMVFP__
- LDR r0, =0xE000EF34 ; Cleanup FPU context: Load FPCCR address
- LDR r1, [r0] ; Load FPCCR
- BIC r1, r1, #1 ; Clear the lazy preservation active bit
- STR r1, [r0] ; Store the value
- ENDIF
+ LDR r0, =0xE000ED28 // Build the Memory Management Fault Status Register (MMFSR)
+ LDRB r1, [r0] // Pickup the MMFSR, with the following bit definitions:
+ // Bit 0 = 1 -> Instruction address violation
+ // Bit 1 = 1 -> Load/store address violation
+ // Bit 7 = 1 -> MMFAR is valid
+ STRB r1, [r0] // Clear the MMFSR
- BL _txm_module_manager_memory_fault_handler ; Call memory manager fault handler
+ BL _txm_module_manager_memory_fault_handler // Call memory manager fault 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
- BL _tx_execution_thread_exit ; Call the thread exit function
- CPSIE i ; Enable interrupts
- ENDIF
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* Call the thread exit function to indicate the thread is no longer executing. */
+ CPSID i // Disable interrupts
+ BL _tx_execution_thread_exit // Call the thread exit function
+ CPSIE i // Enable interrupts
+#endif
- MOV r1, #0 ; Build NULL value
- LDR r0, =_tx_thread_current_ptr ; Pickup address of current thread pointer
- STR r1, [r0] ; Clear current thread pointer
+ MOV r1, #0 // Build NULL value
+ LDR r0, =_tx_thread_current_ptr // Pickup address of current thread pointer
+ STR r1, [r0] // Clear current thread pointer
- ; Return from MemManage_Handler exception
- LDR r0, =0xE000ED04 ; Load ICSR
- LDR r1, =0x10000000 ; Set PENDSVSET bit
- STR r1, [r0] ; Store ICSR
- DSB ; Wait for memory access to complete
- CPSIE i ; Enable interrupts
- MOV lr, #0xFFFFFFFD ; Load exception return code
- BX lr ; Return from exception
-;}
+ // Return from MemManage_Handler exception
+ LDR r0, =0xE000ED04 // Load ICSR
+ LDR r1, =0x10000000 // Set PENDSVSET bit
+ STR r1, [r0] // Store ICSR
+ DSB // Wait for memory access to complete
+ CPSIE i // Enable interrupts
+ MOV lr, #0xFFFFFFFD // Load exception return code
+ BX lr // Return from exception
+
+
+ /* Generic context PendSV handler. */
-;
-; /* Generic context PendSV handler. */
-;
EXPORT PendSV_Handler
EXPORT __tx_PendSVHandler
PendSV_Handler
__tx_PendSVHandler
-;
-; /* Get current thread value and new thread pointer. */
-;
+
+ /* 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 :DEF: __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!!! */
-;
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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
+
+ LDR r0, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR 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
+ LDR 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. */
-;
+
+ /* 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
+ 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
+ ADD r7, r7, #1 // Increment the thread run count
+ STR r7, [r1, #4] // Store the new run count
- IF :DEF: TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-;
-; /* Call the thread entry function to indicate the thread is executing. */
-;
- PUSH {r0, r1} ; Save r0 and r1
- BL _tx_execution_thread_enter ; Call the thread execution enter function
- POP {r0, r1} ; Recover r0 and r1
- ENDIF
-;
-; /* Restore the thread context and PSP. */
-;
- LDR r12, [r1, #8] ; Pickup thread's stack pointer
+ /* Setup global time-slice with thread's current time-slice. */
- MRS r5, CONTROL ; Pickup current CONTROL register
- LDR r4, [r1, #0x98] ; Pickup current user mode flag
- BIC r5, r5, #1 ; Clear the UNPRIV bit
- ORR r4, r4, r5 ; Build new CONTROL register
- MSR CONTROL, r4 ; Setup new CONTROL register
+ STR r5, [r4] // Setup global time-slice
- LDR r0, =0xE000ED94 ; Build MPU control reg address
- MOV r3, #0 ; Build disable value
- STR r3, [r0] ; Disable MPU
- LDR r0, [r1, #0x90] ; Pickup the module instance pointer
- CBZ r0, skip_mpu_setup ; Is this thread owned by a module? No, skip MPU setup
- LDR r1, [r0, #0x64] ; Pickup MPU register[0]
- CBZ r1, skip_mpu_setup ; Is protection required for this module? No, skip MPU setup
- LDR r1, =0xE000ED9C ; Build address of MPU base register
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* Call the thread entry function to indicate the thread is executing. */
+ PUSH {r0, r1} // Save r0 and r1
+ BL _tx_execution_thread_enter // Call the thread execution enter function
+ POP {r0, r1} // Recover r0 and r1
+#endif
- ; Use alias registers to quickly load MPU
- ADD r0, r0, #100 ; Build address of MPU register start in thread control block
- LDM r0!,{r2-r9} ; Load MPU regions 0-3
- STM r1,{r2-r9} ; Store MPU regions 0-3
- LDM r0!,{r2-r9} ; Load MPU regions 4-7
- STM r1,{r2-r9} ; Store MPU regions 4-7
- LDR r0, =0xE000ED94 ; Build MPU control reg address
- MOV r1, #5 ; Build enable value with background region enabled
- STR r1, [r0] ; Enable MPU
+ /* Restore the thread context and PSP. */
+
+ LDR r12, [r1, #8] // Pickup thread's stack pointer
+
+ MRS r5, CONTROL // Pickup current CONTROL register
+ LDR r4, [r1, #0x98] // Pickup current user mode flag
+ BIC r5, r5, #1 // Clear the UNPRIV bit
+ ORR r4, r4, r5 // Build new CONTROL register
+ MSR CONTROL, r4 // Setup new CONTROL register
+
+ LDR r0, =0xE000ED94 // Build MPU control reg address
+ MOV r3, #0 // Build disable value
+ STR r3, [r0] // Disable MPU
+ LDR r0, [r1, #0x90] // Pickup the module instance pointer
+ CBZ r0, skip_mpu_setup // Is this thread owned by a module? No, skip MPU setup
+ LDR r1, [r0, #0x64] // Pickup MPU register[0]
+ CBZ r1, skip_mpu_setup // Is protection required for this module? No, skip MPU setup
+ LDR r1, =0xE000ED9C // Build address of MPU base register
+
+ // Use alias registers to quickly load MPU
+ ADD r0, r0, #100 // Build address of MPU register start in thread control block
+ LDM r0!,{r2-r9} // Load first four MPU regions
+ STM r1,{r2-r9} // Store first four MPU regions
+ LDM r0,{r2-r9} // Load second four MPU regions
+ STM r1,{r2-r9} // Store second four MPU regions
+ LDR r0, =0xE000ED94 // Build MPU control reg address
+ MOV r1, #5 // Build enable value with background region enabled
+ STR r1, [r0] // Enable MPU
skip_mpu_setup
- LDMIA r12!, {LR} ; Pickup LR
- IF :DEF: __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. */
-;
+ 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! */
-;
+ 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_LOW_POWER
+ PUSH {r0-r3}
+ BL tx_low_power_enter // Possibly enter low power mode
+ POP {r0-r3}
+#endif
+
+#ifdef TX_ENABLE_WFI
+ DSB // Ensure no outstanding memory transactions
+ WFI // Wait for interrupt
+ ISB // Ensure pipeline is flushed
+#endif
+
+#ifdef TX_LOW_POWER
+ PUSH {r0-r3}
+ BL tx_low_power_exit // Exit low power mode
+ POP {r0-r3}
+#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
-;}
+ 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
+// }
+
+
+ /* SVC Handler. */
-;
-; /* SVC Handler. */
-;
EXPORT SVC_Handler
EXPORT __tx_SVCallHandler
SVC_Handler
__tx_SVCallHandler
-;{
- MRS r0, PSP ; Pickup the PSP stack
- LDR r1, [r0, #24] ; Pickup the point of interrupt
- LDRB r2, [r1, #-2] ; Pickup the SVC parameter
- ;
- ; Determine which SVC trap we are processing
- ;
- CMP r2, #1 ; Is it the entry into ThreadX?
- BNE _tx_thread_user_return ; No, return to user mode
- ;
- ; At this point we have an SVC 1, which means we are entering the kernel from a module thread with user mode selected
- ;
- LDR r2, =_txm_module_priv ; Subtract 1 because of THUMB mode.
- SUB r2, r2, #1 ; Temporary fix until ARM describes how to load label above correctly.
- CMP r1, r2 ; Did we come from user_mode_entry?
- IT NE ; If no (not equal), then...
- BXNE lr ; return from where we came.
+ MRS r0, PSP // Pickup the PSP stack
+ LDR r1, [r0, #24] // Pickup the point of interrupt
+ LDRB r2, [r1, #-2] // Pickup the SVC parameter
+
+ /* Determine which SVC trap we are processing */
+
+ CMP r2, #1 // Is it the entry into ThreadX?
+ BNE _tx_thread_user_return // No, return to user mode
- LDR r3, [r0, #20] ; This is the saved LR
- LDR r1, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r2, [r1] ; Pickup current thread pointer
- MOV r1, #0 ; Build clear value
- STR r1, [r2, #0x98] ; Clear the current user mode selection for thread
- STR r3, [r2, #0xA0] ; Save the original LR in thread control block
+ /* At this point we have an SVC 1, which means we are entering
+ the kernel from a module thread with user mode selected. */
- ; If there is memory protection, use kernel stack
- LDR r0, [r2, #0x90] ; Load the module instance ptr
- LDR r0, [r0, #0x0C] ; Load the module property flags
- TST r0, #2 ; Check if memory protected
+ LDR r2, =_txm_module_priv // Subtract 1 because of THUMB mode.
+ SUB r2, r2, #1 // Temporary fix until ARM describes how to load label above correctly.
+ CMP r1, r2 // Did we come from user_mode_entry?
+ IT NE // If no (not equal), then...
+ BXNE lr // return from where we came.
+
+ LDR r3, [r0, #20] // This is the saved LR
+ LDR r1, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r2, [r1] // Pickup current thread pointer
+ MOV r1, #0 // Build clear value
+ STR r1, [r2, #0x98] // Clear the current user mode selection for thread
+ STR r3, [r2, #0xA0] // Save the original LR in thread control block
+
+ /* If there is memory protection, use kernel stack */
+ LDR r0, [r2, #0x90] // Load the module instance ptr
+ LDR r0, [r0, #0x0C] // Load the module property flags
+ TST r0, #2 // Check if memory protected
BEQ _tx_skip_kernel_stack_enter
- ; Switch to the module thread's kernel stack
- LDR r0, [r2, #0xA8] ; Load the module kernel stack end
- IF :LNOT: :DEF: TXM_MODULE_KERNEL_STACK_MAINTENANCE_DISABLE
- LDR r1, [r2, #0xA4] ; Load the module kernel stack start
- LDR r3, [r2, #0xAC] ; Load the module kernel stack size
- STR r1, [r2, #12] ; Set stack start
- STR r0, [r2, #16] ; Set stack end
- STR r3, [r2, #20] ; Set stack size
- ENDIF
+ /* Switch to the module thread's kernel stack */
+ LDR r0, [r2, #0xA8] // Load the module kernel stack end
+#ifndef TXM_MODULE_KERNEL_STACK_MAINTENANCE_DISABLE
+ LDR r1, [r2, #0xA4] // Load the module kernel stack start
+ LDR r3, [r2, #0xAC] // Load the module kernel stack size
+ STR r1, [r2, #12] // Set stack start
+ STR r0, [r2, #16] // Set stack end
+ STR r3, [r2, #20] // Set stack size
+#endif
- MRS r3, PSP ; Pickup thread stack pointer
- STR r3, [r2, #0xB0] ; Save thread stack pointer
+ MRS r3, PSP // Pickup thread stack pointer
+ STR r3, [r2, #0xB0] // Save thread stack pointer
- ; Build kernel stack by copying thread stack two registers at a time
- ADD r3, r3, #32 ; start at bottom of hardware stack
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
+ /* Build kernel stack by copying thread stack two registers at a time */
+ ADD r3, r3, #32 // Start at bottom of hardware stack
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
- MSR PSP, r0 ; Set kernel stack pointer
+ MSR PSP, r0 // Set kernel stack pointer
_tx_skip_kernel_stack_enter
- MRS r0, CONTROL ; Pickup current CONTROL register
- BIC r0, r0, #1 ; Clear the UNPRIV bit
- MSR CONTROL, r0 ; Setup new CONTROL register
- BX lr ; Return to thread
+ MRS r0, CONTROL // Pickup current CONTROL register
+ BIC r0, r0, #1 // Clear the UNPRIV bit
+ MSR CONTROL, r0 // Setup new CONTROL register
+ BX lr // Return to thread
_tx_thread_user_return
- LDR r2, =_txm_module_user_mode_exit ; Subtract 1 because of THUMB mode.
- SUB r2, r2, #1 ; Temporary fix until ARM describes how to load label above correctly.
- CMP r1, r2 ; Did we come from user_mode_exit?
- IT NE ; If no (not equal), then...
- BXNE lr ; return from where we came
+ LDR r2, =_txm_module_user_mode_exit // Subtract 1 because of THUMB mode.
+ SUB r2, r2, #1 // Temporary fix until ARM describes how to load label above correctly.
+ CMP r1, r2 // Did we come from user_mode_exit?
+ IT NE // If no (not equal), then...
+ BXNE lr // return from where we came
- LDR r1, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r2, [r1] ; Pickup current thread pointer
- LDR r1, [r2, #0x9C] ; Pick up user mode
- STR r1, [r2, #0x98] ; Set the current user mode selection for thread
+ LDR r1, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r2, [r1] // Pickup current thread pointer
+ LDR r1, [r2, #0x9C] // Pick up user mode
+ STR r1, [r2, #0x98] // Set the current user mode selection for thread
- ; If there is memory protection, use kernel stack
- LDR r0, [r2, #0x90] ; Load the module instance ptr
- LDR r0, [r0, #0x0C] ; Load the module property flags
- TST r0, #2 ; Check if memory protected
+ /* If there is memory protection, use kernel stack */
+ LDR r0, [r2, #0x90] // Load the module instance ptr
+ LDR r0, [r0, #0x0C] // Load the module property flags
+ TST r0, #2 // Check if memory protected
BEQ _tx_skip_kernel_stack_exit
- IF :LNOT: :DEF: TXM_MODULE_KERNEL_STACK_MAINTENANCE_DISABLE
- LDR r0, [r2, #0xB4] ; Load the module thread stack start
- LDR r1, [r2, #0xB8] ; Load the module thread stack end
- LDR r3, [r2, #0xBC] ; Load the module thread stack size
- STR r0, [r2, #12] ; Set stack start
- STR r1, [r2, #16] ; Set stack end
- STR r3, [r2, #20] ; Set stack size
- ENDIF
- LDR r0, [r2, #0xB0] ; Load the module thread stack pointer
- MRS r3, PSP ; Pickup kernel stack pointer
+#ifndef TXM_MODULE_KERNEL_STACK_MAINTENANCE_DISABLE
+ LDR r0, [r2, #0xB4] // Load the module thread stack start
+ LDR r1, [r2, #0xB8] // Load the module thread stack end
+ LDR r3, [r2, #0xBC] // Load the module thread stack size
+ STR r0, [r2, #12] // Set stack start
+ STR r1, [r2, #16] // Set stack end
+ STR r3, [r2, #20] // Set stack size
+#endif
+ LDR r0, [r2, #0xB0] // Load the module thread stack pointer
+ MRS r3, PSP // Pickup kernel stack pointer
- ; Copy kernel hardware stack to module thread stack.
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- SUB r0, r0, #32 ; Subtract 32 to get back to top of stack
- MSR PSP, r0 ; Set thread stack pointer
+ /* Copy kernel hardware stack to module thread stack. */
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ SUB r0, r0, #32 // Subtract 32 to get back to top of stack
+ MSR PSP, r0 // Set thread stack pointer
- LDR r1, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r2, [r1] ; Pickup current thread pointer
- LDR r1, [r2, #0x9C] ; Pick up user mode
+ LDR r1, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r2, [r1] // Pickup current thread pointer
+ LDR r1, [r2, #0x9C] // Pick up user mode
_tx_skip_kernel_stack_exit
- MRS r0, CONTROL ; Pickup current CONTROL register
- ORR r0, r0, r1 ; OR in the user mode bit
- MSR CONTROL, r0 ; Setup new CONTROL register
- BX lr ; Return to thread
-;}
+ MRS r0, CONTROL // Pickup current CONTROL register
+ ORR r0, r0, r1 // OR in the user mode bit
+ MSR CONTROL, r0 // Setup new CONTROL register
+ BX lr // Return to thread
+
ALIGN 4
END
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_stack_build.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_stack_build.S
index 1382a9ba..11effa55 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_stack_build.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_stack_build.S
@@ -1,133 +1,131 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
AREA ||.text||, CODE, READONLY
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_stack_build Cortex-M3/AC5 */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_stack_build Cortex-Mx/AC5 */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
-;}
+
+ /* 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_module/cortex_m3/ac5/module_manager/src/tx_thread_system_return.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_system_return.S
index c15ef851..0ab4ae36 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_system_return.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_thread_system_return.S
@@ -1,85 +1,91 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
AREA ||.text||, CODE, READONLY
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_system_return Cortex-M3/AC5 */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_system_return(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_system_return Cortex-Mx/AC5 */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
+
+ /* 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
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r1, BASEPRI // Thread context returning, pickup BASEPRI
+ MOV r0, #0
+ MSR BASEPRI, r0 // Enable interrupts
+ MSR BASEPRI, r1 // Restore original interrupt posture
+#else
+ MRS r1, PRIMASK // Thread context returning, pickup PRIMASK
+ CPSIE i // Enable interrupts
+ MSR PRIMASK, r1 // Restore original interrupt posture
+#endif
_isr_context
- BX lr ; Return to caller
-;}
+ BX lr // Return to caller
+// }
END
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/tx_timer_interrupt.S b/ports_module/cortex_m3/ac5/module_manager/src/tx_timer_interrupt.S
index e80da8e2..12fef571 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/tx_timer_interrupt.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/tx_timer_interrupt.S
@@ -1,26 +1,25 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the 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 */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the 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 */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
IMPORT _tx_timer_time_slice
IMPORT _tx_timer_system_clock
IMPORT _tx_timer_current_ptr
@@ -33,227 +32,223 @@
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.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_timer_interrupt(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_timer_interrupt Cortex-Mx/AC5 */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
-;
-; }
-;
+
+ /* 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
+ 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
+ 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?
+ // 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)
-; {
-;
- 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
-; {
+
+ /* 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
+ 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;
+
+ 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)
-;
- 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
-;
+
+ /* 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
-; }
-;
+
+ 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
-;
+
+ /* 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
+ CBNZ r2, __tx_something_expired // Did a time-slice expire?
+ // 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
+ 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
-;
-; }
+
+ 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
+ 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
+ /* 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
+ 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
+ LDR 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
+ 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
-;
- LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for
-;
-; }
-;
+
+ 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
-;
-;}
+ DSB // Complete all memory access
+ BX lr // Return to caller
+// }
ALIGN
LTORG
END
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_alignment_adjust.c b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_alignment_adjust.c
index dffb6197..acd22562 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_alignment_adjust.c
+++ b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_alignment_adjust.c
@@ -61,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_power_of_two_block_size(ULONG size)
@@ -128,7 +128,7 @@ ULONG _txm_power_of_two_block_size(ULONG size)
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_alignment_adjust(TXM_MODULE_PREAMBLE *module_preamble,
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_external_memory_enable.c b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_external_memory_enable.c
index 7efbf2df..613cb082 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_external_memory_enable.c
+++ b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_external_memory_enable.c
@@ -70,7 +70,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
UINT _txm_module_manager_external_memory_enable(TXM_MODULE_INSTANCE *module_instance,
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_handler.c b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_handler.c
index c670a087..b435d107 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_handler.c
+++ b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_handler.c
@@ -76,7 +76,7 @@ TXM_MODULE_MANAGER_FAULT_INFO
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_memory_fault_handler(VOID)
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_notify.c b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_notify.c
index 2b757ddd..8a40b3ac 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_notify.c
+++ b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_memory_fault_notify.c
@@ -71,7 +71,7 @@ extern VOID (*_txm_module_manager_fault_notify)(TX_THREAD *, TXM_MODULE_INSTA
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
UINT _txm_module_manager_memory_fault_notify(VOID (*notify_function)(TX_THREAD *, TXM_MODULE_INSTANCE *))
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_mm_register_setup.c b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_mm_register_setup.c
index 7d60aefc..cc0cbd5f 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_mm_register_setup.c
+++ b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_mm_register_setup.c
@@ -61,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_module_manager_region_size_get(ULONG block_size)
@@ -184,7 +184,7 @@ ULONG return_value;
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_module_manager_calculate_srd_bits(ULONG block_size, ULONG length)
@@ -261,7 +261,7 @@ UINT srd_bit_index;
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_mm_register_setup(TXM_MODULE_INSTANCE *module_instance)
diff --git a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_thread_stack_build.S b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_thread_stack_build.S
index aaefebd7..91d808e4 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_thread_stack_build.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_thread_stack_build.S
@@ -1,141 +1,138 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Module Manager */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Module Manager */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
AREA ||.text||, CODE, READONLY
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _txm_module_manager_thread_stack_build Cortex-M3/MPU/AC5 */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* Scott Larson, 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 */
-;/* function_ptr Pointer to shell function */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* None */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* _tx_thread_create Create thread service */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
-;/* DATE NAME DESCRIPTION */
-;/* */
-;/* 09-30-2020 Scott Larson Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _txm_module_manager_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(TX_THREAD *, TXM_MODULE_INSTANCE *))
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _txm_module_manager_thread_stack_build Cortex-M3/MPU/AC5 */
+/* 6.1 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* function_ptr Pointer to shell function */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* None */
+/* */
+/* CALLED BY */
+/* */
+/* _tx_thread_create Create thread service */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* */
+/**************************************************************************/
+// VOID _txm_module_manager_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(TX_THREAD *, TXM_MODULE_INSTANCE *))
+// {
EXPORT _txm_module_manager_thread_stack_build
_txm_module_manager_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
- 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, #28] ; Store initial r10
- STR r3, [r2, #32] ; Store initial r11
-;
-; /* Hardware stack follows. */
-;
- STR r0, [r2, #36] ; Store initial r0, which is the thread control block
- LDR r3, [r0, #8] ; Pickup thread entry info pointer,which is in the stack pointer position of the thread control block.
- ; It was setup in the txm_module_manager_thread_create function. It will be overwritten later in this
- ; function with the actual, initial stack pointer.
- STR r3, [r2, #40] ; Store initial r1, which is the module entry information.
- LDR r3, [r3, #8] ; Pickup data base register from the module information
- STR r3, [r2, #24] ; Store initial r9 (data base register)
- MOV r3, #0 ; Clear r3 again
+ /* 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:
- 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
+ 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
+ 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, #28] // Store initial r10
+ STR r3, [r2, #32] // Store initial r11
+
+ /* Hardware stack follows. */
+
+ STR r0, [r2, #36] // Store initial r0, which is the thread control block
+
+ LDR r3, [r0, #8] // Pickup thread entry info pointer,which is in the stack pointer position of the thread control block.
+ // It was setup in the txm_module_manager_thread_create function. It will be overwritten later in this
+ // function with the actual, initial stack pointer.
+ STR r3, [r2, #40] // Store initial r1, which is the module entry information.
+ LDR r3, [r3, #8] // Pickup data base register from the module information
+ STR r3, [r2, #24] // Store initial r9 (data base register)
+ MOV r3, #0 // Clear r3 again
+
+ 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_module/cortex_m3/ac5/module_manager/src/txm_module_manager_user_mode_entry.S b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_user_mode_entry.S
index 83c9bd4c..86620955 100644
--- a/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_user_mode_entry.S
+++ b/ports_module/cortex_m3/ac5/module_manager/src/txm_module_manager_user_mode_entry.S
@@ -1,88 +1,88 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Module Manager */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Module Manager */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
IMPORT _txm_module_manager_kernel_dispatch
IMPORT _tx_thread_current_ptr
-;
+
AREA ||.text||, CODE, READONLY, ALIGN=5
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _txm_module_manager_user_mode_entry Cortex-M3/MPU/AC5 */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* Scott Larson, Microsoft Corporation */
-;/* */
-;/* DESCRIPTION */
-;/* */
-;/* This function allows modules to enter kernel mode. */
-;/* */
-;/* INPUT */
-;/* */
-;/* None */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* SVC 1 Enter kernel mode */
-;/* SVC 2 Exit kernel mode */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* Modules in user mode */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
-;/* DATE NAME DESCRIPTION */
-;/* */
-;/* 09-30-2020 Scott Larson Initial Version 6.1 */
-;/* */
-;/**************************************************************************/;
-;VOID _txm_module_manager_user_mode_entry(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _txm_module_manager_user_mode_entry Cortex-M3/MPU/AC5 */
+/* 6.1 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function allows modules to enter kernel mode. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* SVC 1 Enter kernel mode */
+/* SVC 2 Exit kernel mode */
+/* */
+/* CALLED BY */
+/* */
+/* Modules in user mode */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* */
+/**************************************************************************/
+// VOID _txm_module_manager_user_mode_entry(VOID)
+// {
EXPORT _txm_module_manager_user_mode_entry
_txm_module_manager_user_mode_entry
- SVC 1 ; Enter kernel
+ SVC 1 // Enter kernel
EXPORT _txm_module_priv
_txm_module_priv
- ; At this point, we are out of user mode. The original LR has been saved in the
- ; thread control block. Simply call the kernel dispatch function.
+ // At this point, we are out of user mode. The original LR has been saved in the
+ // thread control block. Simply call the kernel dispatch function.
BL _txm_module_manager_kernel_dispatch
- ; Pickup the original LR value while still in privileged mode
- LDR r2, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r3, [r2] ; Pickup current thread pointer
- LDR lr, [r3, #0xA0] ; Pickup saved LR from original call
+ // Pickup the original LR value while still in privileged mode
+ LDR r2, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r3, [r2] // Pickup current thread pointer
+ LDR lr, [r3, #0xA0] // Pickup saved LR from original call
- SVC 2 ; Exit kernel and return to user mode
+ SVC 2 // Exit kernel and return to user mode
EXPORT _txm_module_user_mode_exit
_txm_module_user_mode_exit
- BX lr ; Return to the caller
-;}
+ BX lr // Return to the caller
+// }
ALIGN 32
END
diff --git a/ports_module/cortex_m3/ac6/inc/txm_module_port.h b/ports_module/cortex_m3/ac6/inc/txm_module_port.h
index 90975e6c..82b9721c 100644
--- a/ports_module/cortex_m3/ac6/inc/txm_module_port.h
+++ b/ports_module/cortex_m3/ac6/inc/txm_module_port.h
@@ -94,21 +94,16 @@ The following extensions must also be defined in tx_port.h:
VOID (*tx_timer_module_expiration_function)(ULONG id);
*/
+
+/* Size of module heap. */
+#define TXM_MODULE_HEAP_SIZE 512
+
+
/* Define the kernel stack size for a module thread. */
#ifndef TXM_MODULE_KERNEL_STACK_SIZE
#define TXM_MODULE_KERNEL_STACK_SIZE 768
#endif
-/* For the following 3 access control settings, change TEX and C, B, S (bits 21 through 16 of MPU_RASR)
- * to reflect your system memory attributes (cache, shareable, memory type). */
-/* Code region access control: privileged read-only, outer & inner write-back, normal memory, shareable. */
-#define TXM_MODULE_MPU_CODE_ACCESS_CONTROL 0x06070000
-/* Data region access control: execute never, read/write, outer & inner write-back, normal memory, shareable. */
-#define TXM_MODULE_MPU_DATA_ACCESS_CONTROL 0x13070000
-/* Shared region access control: execute never, read-only, outer & inner write-back, normal memory, shareable. */
-#define TXM_MODULE_MPU_SHARED_ACCESS_CONTROL 0x12070000
-
-
/* Define constants specific to the tools the module can be built with for this particular modules port. */
#define TXM_MODULE_IAR_COMPILER 0x00000000
@@ -159,13 +154,13 @@ The following extensions must also be defined in tx_port.h:
/* Define other module port-specific constants. */
-/* Define INLINE_DECLARE to inline for ARM compiler. */
+/* Define INLINE_DECLARE to inline for AC6 compiler. */
#define INLINE_DECLARE inline
-/* Define the number of MPU entries assigned to the code and data sections. On Cortex-M parts, there can only be 7 total
- entries, since ThreadX uses one for access to the kernel dispatch function. */
-
+/* Define the number of MPU entries assigned to the code and data sections.
+ On Cortex-M3 parts, there are 8 total entries. ThreadX uses one for access
+ to the kernel entry function, thus 7 remain for code and data protection. */
#define TXM_MODULE_MANAGER_CODE_MPU_ENTRIES 4
#define TXM_MODULE_MANAGER_DATA_MPU_ENTRIES 3
#define TXM_MODULE_MANAGER_SHARED_MPU_INDEX 8
@@ -217,18 +212,6 @@ typedef struct TXM_MODULE_MANAGER_MEMORY_FAULT_INFO_STRUCT
#define TXM_MODULE_MANAGER_FAULT_INFO \
TXM_MODULE_MANAGER_MEMORY_FAULT_INFO _txm_module_manager_memory_fault_info;
-/* Define the macro to check the stack available in dispatch. */
-#define TXM_MODULE_MANAGER_CHECK_STACK_AVAILABLE \
- ULONG stack_available; \
- __asm("MOV %0, SP" : "=r"(stack_available)); \
- stack_available -= (ULONG)_tx_thread_current_ptr->tx_thread_stack_start; \
- if((stack_available < TXM_MODULE_MINIMUM_STACK_AVAILABLE) || \
- (stack_available > _tx_thread_current_ptr->tx_thread_stack_size)) \
- { \
- return(TX_SIZE_ERROR); \
- }
-
-
/* Define the macro to check the code alignment. */
#define TXM_MODULE_MANAGER_CHECK_CODE_ALIGNMENT(module_location, code_alignment) \
@@ -344,7 +327,7 @@ ULONG _txm_module_manager_calculate_srd_bits(ULONG block_size, ULONG length);
ULONG _txm_module_manager_region_size_get(ULONG block_size);
#define TXM_MODULE_MANAGER_VERSION_ID \
-CHAR _txm_module_manager_version_id[] = \
- "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M3/MPU/AC6 Version 6.1 *";
+CHAR _txm_module_manager_version_id[] = \
+ "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M3/MPU/AC6 Version 6.1.8 *";
#endif
diff --git a/ports_module/cortex_m3/ac6/module_lib/src/txm_module_initialize.S b/ports_module/cortex_m3/ac6/module_lib/src/txm_module_initialize.S
index 455e86b5..cc4bdcc1 100644
--- a/ports_module/cortex_m3/ac6/module_lib/src/txm_module_initialize.S
+++ b/ports_module/cortex_m3/ac6/module_lib/src/txm_module_initialize.S
@@ -2,6 +2,7 @@
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
+/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
@@ -19,11 +20,9 @@
/**************************************************************************/
/**************************************************************************/
-
.global __use_two_region_memory
.global __scatterload
-
.eabi_attribute Tag_ABI_PCS_RO_data, 1
.eabi_attribute Tag_ABI_PCS_R9_use, 1
.eabi_attribute Tag_ABI_PCS_RW_data, 2
diff --git a/ports_module/cortex_m3/ac6/module_lib/src/txm_module_thread_shell_entry.c b/ports_module/cortex_m3/ac6/module_lib/src/txm_module_thread_shell_entry.c
index 34ec131d..e6ebe65f 100644
--- a/ports_module/cortex_m3/ac6/module_lib/src/txm_module_thread_shell_entry.c
+++ b/ports_module/cortex_m3/ac6/module_lib/src/txm_module_thread_shell_entry.c
@@ -89,7 +89,7 @@ extern VOID _txm_module_initialize(VOID);
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_thread_shell_entry(TX_THREAD *thread_ptr, TXM_MODULE_THREAD_ENTRY_INFO *thread_info)
@@ -106,14 +106,14 @@ VOID _txm_module_thread_shell_entry(TX_THREAD *thread_ptr, TXM_MODULE_THREAD_EN
{
/* Initialize the ARM C environment. */
_txm_module_initialize();
-
+
/* Save the entry info pointer, for later use. */
_txm_module_entry_info = thread_info;
-
+
/* Save the kernel function dispatch address. This is used to make all resident calls from
the module. */
_txm_module_kernel_call_dispatcher = thread_info -> txm_module_thread_entry_info_kernel_call_dispatcher;
-
+
/* Ensure that we have a valid pointer. */
while (!_txm_module_kernel_call_dispatcher)
{
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_restore.S b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_restore.S
index da83909f..17a79b0f 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_restore.S
+++ b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_restore.S
@@ -20,6 +20,9 @@
/**************************************************************************/
/**************************************************************************/
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ .global _tx_execution_isr_exit
+#endif
.text
.align 4
@@ -28,20 +31,16 @@
/* */
/* FUNCTION RELEASE */
/* */
-/* _tx_thread_context_restore Cortex-M3/AC6 */
-/* 6.1 */
+/* _tx_thread_context_restore Cortex-Mx/AC6 */
+/* 6.1.8 */
/* AUTHOR */
/* */
-/* William E. Lamie, Microsoft Corporation */
+/* Scott Larson, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is only needed for legacy applications and it should */
/* not be called in any new development on a Cortex-M. */
-/* 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 */
/* */
@@ -53,7 +52,7 @@
/* */
/* CALLS */
/* */
-/* _tx_thread_schedule Thread scheduling routine */
+/* [_tx_execution_isr_exit] Execution profiling ISR exit */
/* */
/* CALLED BY */
/* */
@@ -63,7 +62,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
/* */
/**************************************************************************/
// VOID _tx_thread_context_restore(VOID)
@@ -71,6 +70,13 @@
.global _tx_thread_context_restore
.thumb_func
_tx_thread_context_restore:
- /* Not needed for this port - just return! */
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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} // Recover return address
+#endif
+
BX lr
// }
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_save.S b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_save.S
index e48108d5..511ca82e 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_save.S
+++ b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_context_save.S
@@ -20,27 +20,26 @@
/**************************************************************************/
/**************************************************************************/
-
.text
.align 4
.syntax unified
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ .global _tx_execution_isr_enter
+#endif
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
-/* _tx_thread_context_save Cortex-M3/AC6 */
-/* 6.1 */
+/* _tx_thread_context_save Cortex-Mx/AC6 */
+/* 6.1.8 */
/* AUTHOR */
/* */
-/* William E. Lamie, Microsoft Corporation */
+/* Scott Larson, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is only needed for legacy applications and it should */
/* not be called in any new development on a Cortex-M. */
-/* 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 */
/* */
@@ -52,7 +51,7 @@
/* */
/* CALLS */
/* */
-/* None */
+/* [_tx_execution_isr_enter] Execution profiling ISR enter */
/* */
/* CALLED BY */
/* */
@@ -62,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
/* */
/**************************************************************************/
// VOID _tx_thread_context_save(VOID)
@@ -70,6 +69,15 @@
.global _tx_thread_context_save
.thumb_func
_tx_thread_context_save:
- /* Not needed for this port - just return! */
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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
// }
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_interrupt_control.S b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_interrupt_control.S
index 7336051f..07d2a131 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_interrupt_control.S
+++ b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_interrupt_control.S
@@ -27,11 +27,11 @@
/* */
/* FUNCTION RELEASE */
/* */
-@/* _tx_thread_interrupt_control Cortex-M3/AC6 */
-/* 6.1 */
+/* _tx_thread_interrupt_control Cortex-Mx/AC6 */
+/* 6.1.8 */
/* AUTHOR */
/* */
-/* William E. Lamie, Microsoft Corporation */
+/* Scott Larson, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
@@ -58,7 +58,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
/* */
/**************************************************************************/
// UINT _tx_thread_interrupt_control(UINT new_posture)
@@ -66,15 +66,14 @@
.global _tx_thread_interrupt_control
.thumb_func
_tx_thread_interrupt_control:
-
- // Pickup current interrupt lockout posture.
-
- MRS r1, PRIMASK // Pickup current interrupt lockout
-
- // Apply the new interrupt posture.
-
- MSR PRIMASK, r0 // Apply the new interrupt lockout
- MOV r0, r1 // Transfer old to return register
- BX lr // Return to caller
-
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r1, BASEPRI // Pickup current interrupt posture
+ MSR BASEPRI, r0 // Apply the new interrupt posture
+ MOV r0, r1 // Transfer old to return register
+#else
+ MRS r1, PRIMASK // Pickup current interrupt lockout
+ MSR PRIMASK, r0 // Apply the new interrupt lockout
+ MOV r0, r1 // Transfer old to return register
+#endif
+ BX lr // Return to caller
// }
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_schedule.S b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_schedule.S
index b7615814..345ab227 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_schedule.S
+++ b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_schedule.S
@@ -20,18 +20,21 @@
/**************************************************************************/
/**************************************************************************/
- .global _tx_thread_current_ptr
- .global _tx_thread_execute_ptr
- .global _tx_timer_time_slice
- .global _tx_thread_system_stack_ptr
- .global _tx_thread_preempt_disable
- .global _txm_module_manager_memory_fault_handler
- .global _txm_module_manager_memory_fault_info
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
- .global _tx_execution_thread_enter
- .global _tx_execution_thread_exit
+ .global _tx_thread_current_ptr
+ .global _tx_thread_execute_ptr
+ .global _tx_timer_time_slice
+ .global _tx_thread_system_stack_ptr
+ .global _tx_thread_preempt_disable
+ .global _txm_module_manager_memory_fault_handler
+ .global _txm_module_manager_memory_fault_info
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ .global _tx_execution_thread_enter
+ .global _tx_execution_thread_exit
+#endif
+#ifdef TX_LOW_POWER
+ .global tx_low_power_enter
+ .global tx_low_power_exit
#endif
-
.text
.align 4
.syntax unified
@@ -73,7 +76,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
// VOID _tx_thread_schedule(VOID)
@@ -84,7 +87,7 @@ _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. */
+ from the PendSV handling routine below. */
/* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */
@@ -99,7 +102,6 @@ _tx_thread_schedule:
STR r1, [r0] //
/* Enable interrupts */
-
CPSIE i
/* Enter the scheduler for the first time. */
@@ -188,10 +190,8 @@ UsageFault_Handler:
BL _txm_module_manager_memory_fault_handler // Call memory manager fault handler
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
/* Call the thread exit function to indicate the thread is no longer executing. */
-
CPSID i // Disable interrupts
BL _tx_execution_thread_exit // Call the thread exit function
CPSIE i // Enable interrupts
@@ -224,10 +224,8 @@ __tx_PendSVHandler:
__tx_ts_handler:
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
/* 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
@@ -294,10 +292,8 @@ __tx_ts_restore:
STR r5, [r4] // Setup global time-slice
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
/* Call the thread entry function to indicate the thread is executing. */
-
PUSH {r0, r1} // Save r0 and r1
BL _tx_execution_thread_enter // Call the thread execution enter function
POP {r0, r1} // Recover r0 and r1
@@ -324,10 +320,10 @@ __tx_ts_restore:
// Use alias registers to quickly load MPU
ADD r0, r0, #100 // Build address of MPU register start in thread control block
- LDM r0!,{r2-r9} // Load MPU regions 0-3
- STM r1,{r2-r9} // Store MPU regions 0-3
- LDM r0!,{r2-r9} // Load MPU regions 4-7
- STM r1,{r2-r9} // Store MPU regions 4-7
+ LDM r0!,{r2-r9} // Load first four MPU regions
+ STM r1,{r2-r9} // Store first four MPU regions
+ LDM r0,{r2-r9} // Load second four MPU regions
+ STM r1,{r2-r9} // Store second four MPU regions
LDR r0, =0xE000ED94 // Build MPU control reg address
MOV r1, #5 // Build enable value with background region enabled
STR r1, [r0] // Enable MPU
@@ -349,11 +345,25 @@ __tx_ts_wait:
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_LOW_POWER
+ PUSH {r0-r3}
+ BL tx_low_power_enter // Possibly enter low power mode
+ POP {r0-r3}
+#endif
+
#ifdef TX_ENABLE_WFI
DSB // Ensure no outstanding memory transactions
WFI // Wait for interrupt
ISB // Ensure pipeline is flushed
#endif
+
+#ifdef TX_LOW_POWER
+ PUSH {r0-r3}
+ BL tx_low_power_exit // Exit low power mode
+ POP {r0-r3}
+#endif
+
CPSIE i // Enable interrupts
B __tx_ts_wait // Loop to continue waiting
@@ -369,6 +379,7 @@ __tx_ts_ready:
CPSIE i // Enable interrupts
B __tx_ts_restore // Restore the thread
+// }
/* SVC Handler. */
@@ -393,6 +404,7 @@ __tx_SVCallHandler:
the kernel from a module thread with user mode selected. */
LDR r2, =_txm_module_priv // Load address of where we should have come from
+ // Subtract 1 because of THUMB mode.
CMP r1, r2 // Did we come from user_mode_entry?
IT NE // If no (not equal), then...
BXNE lr // return from where we came.
@@ -425,14 +437,14 @@ __tx_SVCallHandler:
/* Build kernel stack by copying thread stack two registers at a time */
ADD r3, r3, #32 // Start at bottom of hardware stack
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
MSR PSP, r0 // Set kernel stack pointer
@@ -444,6 +456,7 @@ _tx_skip_kernel_stack_enter:
_tx_thread_user_return:
LDR r2, =_txm_module_user_mode_exit // Load address of where we should have come from
+ // Subtract 1 because of THUMB mode.
CMP r1, r2 // Did we come from user_mode_exit?
IT NE // If no (not equal), then...
BXNE lr // return from where we came
@@ -471,14 +484,14 @@ _tx_thread_user_return:
MRS r3, PSP // Pickup kernel stack pointer
/* Copy kernel hardware stack to module thread stack. */
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
SUB r0, r0, #32 // Subtract 32 to get back to top of stack
MSR PSP, r0 // Set thread stack pointer
@@ -493,10 +506,10 @@ _tx_skip_kernel_stack_exit:
BX lr // Return to thread
- /* Kernel entry function from user mode. */
+ /* Kernel entry function from user mode. */
.global _txm_module_manager_kernel_dispatch
- .align 5
+ .align 5
.syntax unified
// VOID _txm_module_manager_user_mode_entry(VOID)
// {
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_stack_build.S b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_stack_build.S
index 548fe34a..d50f9243 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_stack_build.S
+++ b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_stack_build.S
@@ -20,7 +20,6 @@
/**************************************************************************/
/**************************************************************************/
-
.text
.align 4
.syntax unified
@@ -28,11 +27,11 @@
/* */
/* FUNCTION RELEASE */
/* */
-/* _tx_thread_stack_build Cortex-M3/AC6 */
-/* 6.1 */
+/* _tx_thread_stack_build Cortex-Mx/AC6 */
+/* 6.1.8 */
/* AUTHOR */
/* */
-/* William E. Lamie, Microsoft Corporation */
+/* Scott Larson, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
@@ -61,7 +60,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
/* */
/**************************************************************************/
// VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))
@@ -70,7 +69,6 @@
.thumb_func
_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:
@@ -96,7 +94,7 @@ _tx_thread_stack_build:
Stack Bottom: (higher memory address) */
LDR r2, [r0, #16] // Pickup end of stack area
- BIC r2, r2, #0x7 // Align frame
+ 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
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_system_return.S b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_system_return.S
index 1639bbf2..6560db62 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_system_return.S
+++ b/ports_module/cortex_m3/ac6/module_manager/src/tx_thread_system_return.S
@@ -20,7 +20,6 @@
/**************************************************************************/
/**************************************************************************/
-
.text 32
.align 4
.syntax unified
@@ -28,11 +27,11 @@
/* */
/* FUNCTION RELEASE */
/* */
-/* _tx_thread_system_return Cortex-M3/AC6 */
-/* 6.1 */
+/* _tx_thread_system_return Cortex-Mx/AC6 */
+/* 6.1.8 */
/* AUTHOR */
/* */
-/* William E. Lamie, Microsoft Corporation */
+/* Scott Larson, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
@@ -61,7 +60,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
/* */
/**************************************************************************/
// VOID _tx_thread_system_return(VOID)
@@ -79,10 +78,16 @@ _tx_thread_system_return:
MRS r0, IPSR // Pickup IPSR
CMP r0, #0 // Is it a thread returning?
BNE _isr_context // If ISR, skip interrupt enable
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r1, BASEPRI // Thread context returning, pickup BASEPRI
+ MOV r0, #0
+ MSR BASEPRI, r0 // Enable interrupts
+ MSR BASEPRI, r1 // Restore original interrupt posture
+#else
MRS r1, PRIMASK // Thread context returning, pickup PRIMASK
CPSIE i // Enable interrupts
MSR PRIMASK, r1 // Restore original interrupt posture
+#endif
_isr_context:
BX lr // Return to caller
-
// }
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/tx_timer_interrupt.S b/ports_module/cortex_m3/ac6/module_manager/src/tx_timer_interrupt.S
index 2cbef75d..46f54da0 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/tx_timer_interrupt.S
+++ b/ports_module/cortex_m3/ac6/module_manager/src/tx_timer_interrupt.S
@@ -20,17 +20,15 @@
/**************************************************************************/
/**************************************************************************/
-
- .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
-
+ .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
.text
.align 4
@@ -39,19 +37,18 @@
/* */
/* FUNCTION RELEASE */
/* */
-/* _tx_timer_interrupt Cortex-M3/AC6 */
-/* 6.1 */
+/* _tx_timer_interrupt Cortex-Mx/AC6 */
+/* 6.1.8 */
/* AUTHOR */
/* */
-/* William E. Lamie, Microsoft Corporation */
+/* Scott Larson, 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. */
+/* expiration functions are called. */
/* */
/* INPUT */
/* */
@@ -74,7 +71,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
/* */
/**************************************************************************/
// VOID _tx_timer_interrupt(VOID)
@@ -83,8 +80,7 @@
.thumb_func
_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
+ /* Upon entry to this routine, it is assumed that the compiler scratch registers are available
for use. */
/* Increment the system clock. */
@@ -176,7 +172,6 @@ __tx_timer_skip_wrap:
__tx_timer_done:
-
/* See if anything has expired. */
// if ((_tx_timer_expired_time_slice) || (_tx_timer_expired))
// {
@@ -192,7 +187,6 @@ __tx_timer_done:
__tx_something_expired:
-
STMDB sp!, {r0, lr} // Save the lr register on the stack
// and save r0 just to keep 8-byte alignment
@@ -253,5 +247,4 @@ __tx_timer_nothing_expired:
DSB // Complete all memory access
BX lr // Return to caller
-
// }
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_alignment_adjust.c b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_alignment_adjust.c
index 59be7606..85f06b66 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_alignment_adjust.c
+++ b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_alignment_adjust.c
@@ -61,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_power_of_two_block_size(ULONG size)
@@ -128,7 +128,7 @@ ULONG _txm_power_of_two_block_size(ULONG size)
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_alignment_adjust(TXM_MODULE_PREAMBLE *module_preamble,
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_external_memory_enable.c b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_external_memory_enable.c
index 475fc5a2..0e57c7c1 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_external_memory_enable.c
+++ b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_external_memory_enable.c
@@ -70,7 +70,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
UINT _txm_module_manager_external_memory_enable(TXM_MODULE_INSTANCE *module_instance,
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_handler.c b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_handler.c
index c670a087..b435d107 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_handler.c
+++ b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_handler.c
@@ -76,7 +76,7 @@ TXM_MODULE_MANAGER_FAULT_INFO
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_memory_fault_handler(VOID)
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_notify.c b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_notify.c
index 5249a938..f83a982f 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_notify.c
+++ b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_memory_fault_notify.c
@@ -71,7 +71,7 @@ extern VOID (*_txm_module_manager_fault_notify)(TX_THREAD *, TXM_MODULE_INSTA
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
UINT _txm_module_manager_memory_fault_notify(VOID (*notify_function)(TX_THREAD *, TXM_MODULE_INSTANCE *))
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_mm_register_setup.c b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_mm_register_setup.c
index df21aab9..a2e4dfa1 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_mm_register_setup.c
+++ b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_mm_register_setup.c
@@ -61,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_module_manager_region_size_get(ULONG block_size)
@@ -184,7 +184,7 @@ ULONG return_value;
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_module_manager_calculate_srd_bits(ULONG block_size, ULONG length)
@@ -261,7 +261,7 @@ UINT srd_bit_index;
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_mm_register_setup(TXM_MODULE_INSTANCE *module_instance)
diff --git a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_thread_stack_build.S b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_thread_stack_build.S
index 98982a1f..9d0b5a06 100644
--- a/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_thread_stack_build.S
+++ b/ports_module/cortex_m3/ac6/module_manager/src/txm_module_manager_thread_stack_build.S
@@ -23,7 +23,6 @@
.text
.align 4
.syntax unified
-
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
@@ -61,7 +60,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
// VOID _txm_module_manager_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(TX_THREAD *, TXM_MODULE_INSTANCE *))
@@ -73,8 +72,8 @@ _txm_module_manager_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)
+ 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
@@ -111,7 +110,7 @@ _txm_module_manager_thread_stack_build:
STR r3, [r2, #28] // Store initial r10
STR r3, [r2, #32] // Store initial r11
- /* Hardware stack follows. */
+ /* Hardware stack follows. */
STR r0, [r2, #36] // Store initial r0, which is the thread control block
@@ -138,4 +137,3 @@ _txm_module_manager_thread_stack_build:
STR r2, [r0, #8] // Save stack pointer in thread's control block
BX lr // Return to caller
// }
-
diff --git a/ports_module/cortex_m3/gnu/example_build/build_threadx_module_library.bat b/ports_module/cortex_m3/gnu/example_build/build_threadx_module_library.bat
index d0bbae23..b8602074 100644
--- a/ports_module/cortex_m3/gnu/example_build/build_threadx_module_library.bat
+++ b/ports_module/cortex_m3/gnu/example_build/build_threadx_module_library.bat
@@ -1,102 +1,102 @@
del txm.a
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_allocate.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_create.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_delete.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_performance_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_performance_system_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_prioritize.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_release.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_allocate.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_create.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_delete.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_performance_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_performance_system_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_prioritize.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_release.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_create.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_delete.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_performance_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_performance_system_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_set.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_set_notify.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_application_request.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_callback_request_thread_entry.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_object_allocate.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_object_deallocate.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_object_pointer_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\module_lib\src\txm_module_thread_shell_entry.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_thread_system_suspend.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_create.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_delete.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_performance_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_performance_system_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_prioritize.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_put.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_create.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_delete.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_flush.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_front_send.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_performance_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_performance_system_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_prioritize.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_receive.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_send.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_send_notify.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_ceiling_put.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_create.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_delete.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_performance_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_performance_system_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_prioritize.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_put.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_put_notify.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_create.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_delete.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_entry_exit_notify.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_identify.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_interrupt_control.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_performance_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_performance_system_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_preemption_change.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_priority_change.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_relinquish.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_reset.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_resume.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_sleep.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_stack_error_notify.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_suspend.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_terminate.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_time_slice_change.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_wait_abort.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_time_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_time_set.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_activate.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_change.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_create.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_deactivate.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_delete.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_performance_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_performance_system_info_get.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_buffer_full_notify.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_disable.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_enable.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_event_filter.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_event_unfilter.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_isr_enter_insert.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_isr_exit_insert.c
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_user_event_insert.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_allocate.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_create.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_delete.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_performance_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_performance_system_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_pool_prioritize.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_block_release.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_allocate.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_create.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_delete.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_performance_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_performance_system_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_pool_prioritize.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_byte_release.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_create.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_delete.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_performance_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_performance_system_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_set.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_event_flags_set_notify.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_application_request.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_callback_request_thread_entry.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_object_allocate.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_object_deallocate.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_object_pointer_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\module_lib\src\txm_module_thread_shell_entry.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_module_thread_system_suspend.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_create.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_delete.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_performance_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_performance_system_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_prioritize.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_mutex_put.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_create.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_delete.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_flush.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_front_send.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_performance_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_performance_system_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_prioritize.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_receive.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_send.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_queue_send_notify.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_ceiling_put.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_create.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_delete.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_performance_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_performance_system_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_prioritize.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_put.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_semaphore_put_notify.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_create.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_delete.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_entry_exit_notify.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_identify.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_interrupt_control.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_performance_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_performance_system_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_preemption_change.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_priority_change.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_relinquish.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_reset.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_resume.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_sleep.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_stack_error_notify.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_suspend.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_terminate.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_time_slice_change.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_thread_wait_abort.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_time_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_time_set.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_activate.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_change.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_create.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_deactivate.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_delete.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_performance_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_timer_performance_system_info_get.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_buffer_full_notify.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_disable.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_enable.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_event_filter.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_event_unfilter.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_isr_enter_insert.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_isr_exit_insert.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -fpic -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc ..\..\..\..\common_modules\module_lib\src\txm_trace_user_event_insert.c
arm-none-eabi-ar -r txm.a txm_block_allocate.o txm_block_pool_create.o txm_block_pool_delete.o txm_block_pool_info_get.o txm_block_pool_performance_info_get.o txm_block_pool_performance_system_info_get.o
arm-none-eabi-ar -r txm.a txm_block_pool_prioritize.o txm_block_release.o
diff --git a/ports_module/cortex_m3/gnu/example_build/build_threadx_module_sample.bat b/ports_module/cortex_m3/gnu/example_build/build_threadx_module_sample.bat
index 75214cdf..a25f370b 100644
--- a/ports_module/cortex_m3/gnu/example_build/build_threadx_module_sample.bat
+++ b/ports_module/cortex_m3/gnu/example_build/build_threadx_module_sample.bat
@@ -1,5 +1,5 @@
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -fpie -fno-plt -mpic-data-is-text-relative -msingle-pic-base txm_module_preamble.s
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -fpie -fno-plt -mpic-data-is-text-relative -msingle-pic-base gcc_setup.S
-arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -fpie -fno-plt -mpic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc sample_threadx_module.c
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -fpie -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base txm_module_preamble.s
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -fpie -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base gcc_setup.S
+arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -fpie -fno-plt -mno-pic-data-is-text-relative -msingle-pic-base -I..\inc -I..\..\..\..\common\inc -I..\..\..\..\common_modules\inc sample_threadx_module.c
arm-none-eabi-ld -A cortex-m3 -T sample_threadx_module.ld txm_module_preamble.o gcc_setup.o sample_threadx_module.o -e _txm_module_thread_shell_entry txm.a -o sample_threadx_module.axf -M > sample_threadx_module.map
diff --git a/ports_module/cortex_m3/gnu/example_build/sample_threadx_module.ld b/ports_module/cortex_m3/gnu/example_build/sample_threadx_module.ld
index a33fbfeb..30c66655 100644
--- a/ports_module/cortex_m3/gnu/example_build/sample_threadx_module.ld
+++ b/ports_module/cortex_m3/gnu/example_build/sample_threadx_module.ld
@@ -9,8 +9,8 @@ SECTIONS
{
__FLASH_segment_start__ = 0x00030000;
__FLASH_segment_end__ = 0x00040000;
- __RAM_segment_start__ = 0;
- __RAM_segment_end__ = 0x8000;
+ __RAM_segment_start__ = 0x10000000;
+ __RAM_segment_end__ = 0x10008000;
__HEAPSIZE__ = 128;
@@ -136,7 +136,7 @@ SECTIONS
}
__rodata_end__ = __rodata_start__ + SIZEOF(.rodata);
- __code_size__ = __rodata_end__ - __FLASH_segment_start__;
+ __code_size__ = SIZEOF(.data) + __rodata_end__ - __FLASH_segment_start__;
__fast_load_start__ = ALIGN(__rodata_end__ , 4);
diff --git a/ports_module/cortex_m3/gnu/inc/txm_module_port.h b/ports_module/cortex_m3/gnu/inc/txm_module_port.h
index e16ad79a..01102ffa 100644
--- a/ports_module/cortex_m3/gnu/inc/txm_module_port.h
+++ b/ports_module/cortex_m3/gnu/inc/txm_module_port.h
@@ -94,6 +94,11 @@ The following extensions must also be defined in tx_port.h:
VOID (*tx_timer_module_expiration_function)(ULONG id);
*/
+
+/* Size of module heap. */
+#define TXM_MODULE_HEAP_SIZE 512
+
+
/* Define the kernel stack size for a module thread. */
#ifndef TXM_MODULE_KERNEL_STACK_SIZE
#define TXM_MODULE_KERNEL_STACK_SIZE 768
@@ -153,9 +158,9 @@ The following extensions must also be defined in tx_port.h:
#define INLINE_DECLARE inline
-/* Define the number of MPU entries assigned to the code and data sections. On Cortex-M parts, there can only be 7 total
- entries, since ThreadX uses one for access to the kernel dispatch function. */
-
+/* Define the number of MPU entries assigned to the code and data sections.
+ On Cortex-M3 parts, there are 8 total entries. ThreadX uses one for access
+ to the kernel entry function, thus 7 remain for code and data protection. */
#define TXM_MODULE_MANAGER_CODE_MPU_ENTRIES 4
#define TXM_MODULE_MANAGER_DATA_MPU_ENTRIES 3
#define TXM_MODULE_MANAGER_SHARED_MPU_INDEX 8
@@ -322,7 +327,7 @@ ULONG _txm_module_manager_calculate_srd_bits(ULONG block_size, ULONG length);
ULONG _txm_module_manager_region_size_get(ULONG block_size);
#define TXM_MODULE_MANAGER_VERSION_ID \
-CHAR _txm_module_manager_version_id[] = \
- "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M3/MPU/GNU Version 6.1 *";
+CHAR _txm_module_manager_version_id[] = \
+ "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M3/MPU/GNU Version 6.1.8 *";
#endif
diff --git a/ports_module/cortex_m3/gnu/module_lib/src/txm_module_thread_shell_entry.c b/ports_module/cortex_m3/gnu/module_lib/src/txm_module_thread_shell_entry.c
index a20983fa..87b73b9b 100644
--- a/ports_module/cortex_m3/gnu/module_lib/src/txm_module_thread_shell_entry.c
+++ b/ports_module/cortex_m3/gnu/module_lib/src/txm_module_thread_shell_entry.c
@@ -91,7 +91,7 @@ extern VOID _gcc_setup(TXM_MODULE_INSTANCE *);
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_thread_shell_entry(TX_THREAD *thread_ptr, TXM_MODULE_THREAD_ENTRY_INFO *thread_info)
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_restore.S b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_restore.S
index d279e33e..e445e690 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_restore.S
+++ b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_restore.S
@@ -1,87 +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 */
-@/** */
-@/**************************************************************************/
-@/**************************************************************************/
-@
-@
- .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
-@
-@
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ .global _tx_execution_isr_exit
+#endif
+
.text
.align 4
.syntax unified
-@/**************************************************************************/
-@/* */
-@/* FUNCTION RELEASE */
-@/* */
-@/* _tx_thread_context_restore Cortex-M3/GNU */
-@/* 6.1 */
-@/* AUTHOR */
-@/* */
-@/* William E. Lamie, Microsoft Corporation */
-@/* */
-@/* DESCRIPTION */
-@/* */
-@/* This function is only needed for legacy applications and it should */
-@/* not be called in any new development on a Cortex-M. */
-@/* 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 */
-@/* */
-@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-@/* */
-@/**************************************************************************/
-@VOID _tx_thread_context_restore(VOID)
-@{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_context_restore Cortex-Mx/GNU */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is only needed for legacy applications and it should */
+/* not be called in any new development on a Cortex-M. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* [_tx_execution_isr_exit] Execution profiling ISR exit */
+/* */
+/* CALLED BY */
+/* */
+/* ISRs Interrupt Service Routines */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// VOID _tx_thread_context_restore(VOID)
+// {
.global _tx_thread_context_restore
.thumb_func
_tx_thread_context_restore:
-@
-@ /* Not needed for this port - just return! */
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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} // Recover return address
+#endif
+
BX lr
-@}
+// }
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_save.S b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_save.S
index 357f633a..e4f2778a 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_save.S
+++ b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_context_save.S
@@ -1,81 +1,80 @@
-@/**************************************************************************/
-@/* */
-@/* Copyright (c) Microsoft Corporation. All rights reserved. */
-@/* */
-@/* This software is licensed under the Microsoft Software License */
-@/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-@/* and in the root directory of this software. */
-@/* */
-@/**************************************************************************/
-@
-@
-@/**************************************************************************/
-@/**************************************************************************/
-@/** */
-@/** ThreadX Component */
-@/** */
-@/** Thread */
-@/** */
-@/**************************************************************************/
-@/**************************************************************************/
-@
-@
- .global _tx_thread_system_state
- .global _tx_thread_current_ptr
- .global _tx_execution_isr_enter
-@
-@
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
.text
.align 4
.syntax unified
-@/**************************************************************************/
-@/* */
-@/* FUNCTION RELEASE */
-@/* */
-@/* _tx_thread_context_save Cortex-M3/GNU */
-@/* 6.1 */
-@/* AUTHOR */
-@/* */
-@/* William E. Lamie, Microsoft Corporation */
-@/* */
-@/* DESCRIPTION */
-@/* */
-@/* This function is only needed for legacy applications and it should */
-@/* not be called in any new development on a Cortex-M. */
-@/* 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 */
-@/* */
-@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-@/* */
-@/**************************************************************************/
-@VOID _tx_thread_context_save(VOID)
-@{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_context_save Cortex-Mx/GNU */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is only needed for legacy applications and it should */
+/* not be called in any new development on a Cortex-M. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* [_tx_execution_isr_enter] Execution profiling ISR enter */
+/* */
+/* CALLED BY */
+/* */
+/* ISRs */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// VOID _tx_thread_context_save(VOID)
+// {
.global _tx_thread_context_save
.thumb_func
_tx_thread_context_save:
-@
-@ /* Not needed for this port - just return! */
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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
-@}
+// }
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_interrupt_control.S b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_interrupt_control.S
index 22331e70..99e14c06 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_interrupt_control.S
+++ b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_interrupt_control.S
@@ -1,81 +1,79 @@
-@/**************************************************************************/
-@/* */
-@/* Copyright (c) Microsoft Corporation. All rights reserved. */
-@/* */
-@/* This software is licensed under the Microsoft Software License */
-@/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-@/* and in the root directory of this software. */
-@/* */
-@/**************************************************************************/
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
-@/**************************************************************************/
-@/**************************************************************************/
-@/** */
-@/** ThreadX Component */
-@/** */
-@/** Thread */
-@/** */
-@/**************************************************************************/
-@/**************************************************************************/
-
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
.text 32
.align 4
.syntax unified
-@/**************************************************************************/
-@/* */
-@/* FUNCTION RELEASE */
-@/* */
-@/* _tx_thread_interrupt_control Cortex-M3/GNU */
-@/* 6.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 */
-@/* */
-@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-@/* */
-@/**************************************************************************/
-@/* UINT _tx_thread_interrupt_control(UINT new_posture)
-{ */
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_interrupt_control Cortex-Mx/GNU */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// UINT _tx_thread_interrupt_control(UINT new_posture)
+// {
.global _tx_thread_interrupt_control
.thumb_func
_tx_thread_interrupt_control:
-
-@/* Pickup current interrupt lockout posture. */
-
- MRS r1, PRIMASK @ Pickup current interrupt lockout
-
-@/* Apply the new interrupt posture. */
-
- MSR PRIMASK, r0 @ Apply the new interrupt lockout
- MOV r0, r1 @ Transfer old to return register
- BX lr @ Return to caller
-
-@/* } */
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r1, BASEPRI // Pickup current interrupt posture
+ MSR BASEPRI, r0 // Apply the new interrupt posture
+ MOV r0, r1 // Transfer old to return register
+#else
+ MRS r1, PRIMASK // Pickup current interrupt lockout
+ MSR PRIMASK, r0 // Apply the new interrupt lockout
+ MOV r0, r1 // Transfer old to return register
+#endif
+ BX lr // Return to caller
+// }
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_schedule.S b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_schedule.S
index 643243d5..c0aaaec9 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_schedule.S
+++ b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_schedule.S
@@ -20,16 +20,18 @@
/**************************************************************************/
/**************************************************************************/
- .global _tx_thread_current_ptr
- .global _tx_thread_execute_ptr
- .global _tx_timer_time_slice
- .global _tx_thread_system_stack_ptr
- .global _tx_execution_thread_enter
- .global _tx_execution_thread_exit
- .global _tx_thread_preempt_disable
- .global _txm_module_manager_memory_fault_handler
- .global _txm_module_manager_memory_fault_info
-
+ .global _tx_thread_current_ptr
+ .global _tx_thread_execute_ptr
+ .global _tx_timer_time_slice
+ .global _tx_execution_thread_enter
+ .global _tx_execution_thread_exit
+ .global _tx_thread_preempt_disable
+ .global _txm_module_manager_memory_fault_handler
+ .global _txm_module_manager_memory_fault_info
+#ifdef TX_LOW_POWER
+ .global tx_low_power_enter
+ .global tx_low_power_exit
+#endif
.text
.align 4
.syntax unified
@@ -71,7 +73,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
// VOID _tx_thread_schedule(VOID)
@@ -82,7 +84,7 @@ _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. */
+ from the PendSV handling routine below. */
/* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */
@@ -97,7 +99,6 @@ _tx_thread_schedule:
STR r1, [r0] //
/* Enable interrupts */
-
CPSIE i
/* Enter the scheduler for the first time. */
@@ -186,10 +187,8 @@ UsageFault_Handler:
BL _txm_module_manager_memory_fault_handler // Call memory manager fault handler
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
/* Call the thread exit function to indicate the thread is no longer executing. */
-
CPSID i // Disable interrupts
BL _tx_execution_thread_exit // Call the thread exit function
CPSIE i // Enable interrupts
@@ -223,10 +222,8 @@ __tx_PendSVHandler:
__tx_ts_handler:
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
/* 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
@@ -293,10 +290,8 @@ __tx_ts_restore:
STR r5, [r4] // Setup global time-slice
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
/* Call the thread entry function to indicate the thread is executing. */
-
PUSH {r0, r1} // Save r0 and r1
BL _tx_execution_thread_enter // Call the thread execution enter function
POP {r0, r1} // Recover r0 and r1
@@ -348,11 +343,25 @@ __tx_ts_wait:
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_LOW_POWER
+ PUSH {r0-r3}
+ BL tx_low_power_enter // Possibly enter low power mode
+ POP {r0-r3}
+#endif
+
#ifdef TX_ENABLE_WFI
DSB // Ensure no outstanding memory transactions
WFI // Wait for interrupt
ISB // Ensure pipeline is flushed
#endif
+
+#ifdef TX_LOW_POWER
+ PUSH {r0-r3}
+ BL tx_low_power_exit // Exit low power mode
+ POP {r0-r3}
+#endif
+
CPSIE i // Enable interrupts
B __tx_ts_wait // Loop to continue waiting
@@ -368,6 +377,7 @@ __tx_ts_ready:
CPSIE i // Enable interrupts
B __tx_ts_restore // Restore the thread
+// }
/* SVC Handler. */
@@ -393,6 +403,7 @@ __tx_SVCallHandler:
the kernel from a module thread with user mode selected. */
LDR r2, =_txm_module_priv // Load address of where we should have come from
+ // Subtract 1 because of THUMB mode.
CMP r1, r2 // Did we come from user_mode_entry?
IT NE // If no (not equal), then...
BXNE lr // return from where we came.
@@ -425,14 +436,14 @@ __tx_SVCallHandler:
/* Build kernel stack by copying thread stack two registers at a time */
ADD r3, r3, #32 // Start at bottom of hardware stack
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
MSR PSP, r0 // Set kernel stack pointer
@@ -444,6 +455,7 @@ _tx_skip_kernel_stack_enter:
_tx_thread_user_return:
LDR r2, =_txm_module_user_mode_exit // Load address of where we should have come from
+ // Subtract 1 because of THUMB mode.
CMP r1, r2 // Did we come from user_mode_exit?
IT NE // If no (not equal), then...
BXNE lr // return from where we came
@@ -471,14 +483,14 @@ _tx_thread_user_return:
MRS r3, PSP // Pickup kernel stack pointer
/* Copy kernel hardware stack to module thread stack. */
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
SUB r0, r0, #32 // Subtract 32 to get back to top of stack
MSR PSP, r0 // Set thread stack pointer
@@ -493,7 +505,7 @@ _tx_skip_kernel_stack_exit:
BX lr // Return to thread
- /* Kernel entry function from user mode. */
+ /* Kernel entry function from user mode. */
.global _txm_module_manager_kernel_dispatch
.align 5
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_stack_build.S b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_stack_build.S
index 05a03d86..d0246c13 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_stack_build.S
+++ b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_stack_build.S
@@ -1,135 +1,133 @@
-@/**************************************************************************/
-@/* */
-@/* Copyright (c) Microsoft Corporation. All rights reserved. */
-@/* */
-@/* This software is licensed under the Microsoft Software License */
-@/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-@/* and in the root directory of this software. */
-@/* */
-@/**************************************************************************/
-@
-@
-@/**************************************************************************/
-@/**************************************************************************/
-@/** */
-@/** ThreadX Component */
-@/** */
-@/** Thread */
-@/** */
-@/**************************************************************************/
-@/**************************************************************************/
-@
-@
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
.text
.align 4
.syntax unified
-@/**************************************************************************/
-@/* */
-@/* FUNCTION RELEASE */
-@/* */
-@/* _tx_thread_stack_build Cortex-M3/GNU */
-@/* 6.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 */
-@/* */
-@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-@/* */
-@/**************************************************************************/
-@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))
-@{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_stack_build Cortex-Mx/GNU */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))
+// {
.global _tx_thread_stack_build
.thumb_func
_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
- 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
-@}
+
+ /* 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
+// }
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_system_return.S b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_system_return.S
index 7804a65c..1f20e1a6 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_system_return.S
+++ b/ports_module/cortex_m3/gnu/module_manager/src/tx_thread_system_return.S
@@ -1,88 +1,93 @@
-@/**************************************************************************/
-@/* */
-@/* Copyright (c) Microsoft Corporation. All rights reserved. */
-@/* */
-@/* This software is licensed under the Microsoft Software License */
-@/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-@/* and in the root directory of this software. */
-@/* */
-@/**************************************************************************/
-@
-@
-@/**************************************************************************/
-@/**************************************************************************/
-@/** */
-@/** ThreadX Component */
-@/** */
-@/** Thread */
-@/** */
-@/**************************************************************************/
-@/**************************************************************************/
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
.text 32
.align 4
.syntax unified
-@/**************************************************************************/
-@/* */
-@/* FUNCTION RELEASE */
-@/* */
-@/* _tx_thread_system_return Cortex-M3/GNU */
-@/* 6.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 */
-@/* */
-@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-@/* */
-@/**************************************************************************/
-@/* VOID _tx_thread_system_return(VOID)
-@{ */
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_system_return Cortex-Mx/GNU */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// VOID _tx_thread_system_return(VOID)
+// {
.thumb_func
.global _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
-@/* } */
+ /* 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
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r1, BASEPRI // Thread context returning, pickup BASEPRI
+ MOV r0, #0
+ MSR BASEPRI, r0 // Enable interrupts
+ MSR BASEPRI, r1 // Restore original interrupt posture
+#else
+ MRS r1, PRIMASK // Thread context returning, pickup PRIMASK
+ CPSIE i // Enable interrupts
+ MSR PRIMASK, r1 // Restore original interrupt posture
+#endif
+_isr_context:
+ BX lr // Return to caller
+// }
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/tx_timer_interrupt.S b/ports_module/cortex_m3/gnu/module_manager/src/tx_timer_interrupt.S
index 39721ec6..9551a2b2 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/tx_timer_interrupt.S
+++ b/ports_module/cortex_m3/gnu/module_manager/src/tx_timer_interrupt.S
@@ -1,257 +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 */
-@/** */
-@/** Timer */
-@/** */
-@/**************************************************************************/
-@/**************************************************************************/
-@
-@
- .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
-@
-@
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the 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 */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
+ .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
+
.text
.align 4
.syntax unified
-@/**************************************************************************/
-@/* */
-@/* FUNCTION RELEASE */
-@/* */
-@/* _tx_timer_interrupt Cortex-M3/GNU */
-@/* 6.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 */
-@/* */
-@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-@/* */
-@/**************************************************************************/
-@VOID _tx_timer_interrupt(VOID)
-@{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_timer_interrupt Cortex-Mx/GNU */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// VOID _tx_timer_interrupt(VOID)
+// {
.global _tx_timer_interrupt
.thumb_func
_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
-@
-@ }
-@
+
+ /* 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
+ 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
+ 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?
+ // 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 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
- MOV r2, #1 @ Build expired value
- STR r2, [r3, #0] @ Set expired flag
- B __tx_timer_done @ Finished timer processing
-@
-@ }
-@ else
-@ {
+
+ /* 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
+ 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;
+
+ 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
-@
+
+ /* 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
-@ }
-@
+
+ 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
-@
+
+ /* 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
+ CBNZ r2, __tx_something_expired // Did a time-slice expire?
+ // 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
+ 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)
-@ {
-@
- 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
-@
-@ }
+
+ 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
+ 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)
-@ {
-@
- 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?
- CBNZ r1, __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
+
+ /* 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
+ 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
+ LDR 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
+ 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:
-@
- LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for
- @ the 8-byte stack alignment
-@
-@ }
-@
+
+ 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
-@
-@}
+ DSB // Complete all memory access
+ BX lr // Return to caller
+// }
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_alignment_adjust.c b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_alignment_adjust.c
index 28486298..a4d86f6d 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_alignment_adjust.c
+++ b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_alignment_adjust.c
@@ -61,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_power_of_two_block_size(ULONG size)
@@ -128,7 +128,7 @@ ULONG _txm_power_of_two_block_size(ULONG size)
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_alignment_adjust(TXM_MODULE_PREAMBLE *module_preamble,
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_external_memory_enable.c b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_external_memory_enable.c
index 4647d857..22eca632 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_external_memory_enable.c
+++ b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_external_memory_enable.c
@@ -70,7 +70,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
UINT _txm_module_manager_external_memory_enable(TXM_MODULE_INSTANCE *module_instance,
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_handler.c b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_handler.c
index 316b9cb9..39db82f1 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_handler.c
+++ b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_handler.c
@@ -76,7 +76,7 @@ TXM_MODULE_MANAGER_FAULT_INFO
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_memory_fault_handler(VOID)
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_notify.c b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_notify.c
index 75099528..9af12b84 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_notify.c
+++ b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_memory_fault_notify.c
@@ -71,7 +71,7 @@ extern VOID (*_txm_module_manager_fault_notify)(TX_THREAD *, TXM_MODULE_INSTA
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
UINT _txm_module_manager_memory_fault_notify(VOID (*notify_function)(TX_THREAD *, TXM_MODULE_INSTANCE *))
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_mm_register_setup.c b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_mm_register_setup.c
index 24679cef..f302903c 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_mm_register_setup.c
+++ b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_mm_register_setup.c
@@ -61,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_module_manager_region_size_get(ULONG block_size)
@@ -184,7 +184,7 @@ ULONG return_value;
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_module_manager_calculate_srd_bits(ULONG block_size, ULONG length)
@@ -261,7 +261,7 @@ UINT srd_bit_index;
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_mm_register_setup(TXM_MODULE_INSTANCE *module_instance)
diff --git a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_thread_stack_build.s b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_thread_stack_build.s
index 9dff891d..d2d13132 100644
--- a/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_thread_stack_build.s
+++ b/ports_module/cortex_m3/gnu/module_manager/src/txm_module_manager_thread_stack_build.s
@@ -23,7 +23,6 @@
.text
.align 4
.syntax unified
-
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
@@ -61,7 +60,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
// VOID _txm_module_manager_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(TX_THREAD *, TXM_MODULE_INSTANCE *))
@@ -73,8 +72,8 @@ _txm_module_manager_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)
+ 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
@@ -111,7 +110,7 @@ _txm_module_manager_thread_stack_build:
STR r3, [r2, #28] // Store initial r10
STR r3, [r2, #32] // Store initial r11
- /* Hardware stack follows. */
+ /* Hardware stack follows. */
STR r0, [r2, #36] // Store initial r0, which is the thread control block
@@ -137,3 +136,4 @@ _txm_module_manager_thread_stack_build:
STR r2, [r0, #8] // Save stack pointer in thread's control block
BX lr // Return to caller
+// }
diff --git a/ports_module/cortex_m3/iar/inc/txm_module_port.h b/ports_module/cortex_m3/iar/inc/txm_module_port.h
index 04f97122..a2d7354b 100644
--- a/ports_module/cortex_m3/iar/inc/txm_module_port.h
+++ b/ports_module/cortex_m3/iar/inc/txm_module_port.h
@@ -40,7 +40,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* 04-02-2021 Scott Larson Modified comment(s) and */
/* added check for overflow, */
/* resulting in version 6.1.6 */
@@ -95,9 +95,14 @@ The following extensions must also be defined in tx_port.h:
VOID (*tx_timer_module_expiration_function)(ULONG id);
*/
+
+/* Size of module heap. */
+#define TXM_MODULE_HEAP_SIZE 512
+
+
/* Define the kernel stack size for a module thread. */
#ifndef TXM_MODULE_KERNEL_STACK_SIZE
-#define TXM_MODULE_KERNEL_STACK_SIZE 512
+#define TXM_MODULE_KERNEL_STACK_SIZE 768
#endif
/* Define constants specific to the tools the module can be built with for this particular modules port. */
@@ -154,9 +159,9 @@ The following extensions must also be defined in tx_port.h:
#define INLINE_DECLARE inline
-/* Define the number of MPU entries assigned to the code and data sections. On Cortex-M parts, there can only be 7 total
- entries, since ThreadX uses one for access to the kernel dispatch function. */
-
+/* Define the number of MPU entries assigned to the code and data sections.
+ On Cortex-M3 parts, there are 8 total entries. ThreadX uses one for access
+ to the kernel entry function, thus 7 remain for code and data protection. */
#define TXM_MODULE_MANAGER_CODE_MPU_ENTRIES 4
#define TXM_MODULE_MANAGER_DATA_MPU_ENTRIES 3
#define TXM_MODULE_MANAGER_SHARED_MPU_INDEX 8
@@ -323,7 +328,7 @@ ULONG _txm_module_manager_calculate_srd_bits(ULONG block_size, ULONG length);
ULONG _txm_module_manager_region_size_get(ULONG block_size);
#define TXM_MODULE_MANAGER_VERSION_ID \
-CHAR _txm_module_manager_version_id[] = \
- "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M3/MPU/IAR Version 6.1 *";
+CHAR _txm_module_manager_version_id[] = \
+ "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M3/MPU/IAR Version 6.1.8 *";
#endif
diff --git a/ports_module/cortex_m3/iar/module_lib/src/txm_module_thread_shell_entry.c b/ports_module/cortex_m3/iar/module_lib/src/txm_module_thread_shell_entry.c
index bac4233a..40355375 100644
--- a/ports_module/cortex_m3/iar/module_lib/src/txm_module_thread_shell_entry.c
+++ b/ports_module/cortex_m3/iar/module_lib/src/txm_module_thread_shell_entry.c
@@ -91,7 +91,7 @@ extern VOID __iar_data_init3(VOID);
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_thread_shell_entry(TX_THREAD *thread_ptr, TXM_MODULE_THREAD_ENTRY_INFO *thread_info)
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_misra.s b/ports_module/cortex_m3/iar/module_manager/src/tx_misra.s
index a999ea98..53c60fbc 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_misra.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_misra.s
@@ -96,6 +96,12 @@
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
@@ -980,7 +986,7 @@ _tx_misra_char_to_uchar_pointer_convert:
BX LR ;; return
-***********************************************************************************************/
+/***********************************************************************************************/
/***********************************************************************************************/
/** */
/** ULONG _tx_misra_ipsr_get(void); */
@@ -995,6 +1001,71 @@ _tx_misra_ipsr_get:
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
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_restore.s b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_restore.s
index 9842f8ce..0a188df9 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_restore.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_restore.s
@@ -1,89 +1,78 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
EXTERN _tx_execution_isr_exit
-;
-;
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_context_restore Cortex-M3/IAR */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* William E. Lamie, Microsoft Corporation */
-;/* */
-;/* DESCRIPTION */
-;/* */
-;/* This function is only needed for legacy applications and it should */
-;/* not be called in any new development on a Cortex-M. */
-;/* 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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_context_restore(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_context_restore Cortex-Mx/IAR */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is only needed for legacy applications and it should */
+/* not be called in any new development on a Cortex-M. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* [_tx_execution_isr_exit] Execution profiling ISR exit */
+/* */
+/* CALLED BY */
+/* */
+/* ISRs Interrupt Service Routines */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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} // Recover return address
#endif
-;
- POP {lr}
+
BX lr
-;
-;}
+// }
END
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_save.s b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_save.s
index 23462fdc..e71ae496 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_save.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_context_save.s
@@ -1,87 +1,80 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
EXTERN _tx_execution_isr_enter
-;
-;
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_context_save Cortex-M3/IAR */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* William E. Lamie, Microsoft Corporation */
-;/* */
-;/* DESCRIPTION */
-;/* */
-;/* This function is only needed for legacy applications and it should */
-;/* not be called in any new development on a Cortex-M. */
-;/* 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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_context_save(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_context_save Cortex-Mx/IAR */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is only needed for legacy applications and it should */
+/* not be called in any new development on a Cortex-M. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* [_tx_execution_isr_enter] Execution profiling ISR enter */
+/* */
+/* CALLED BY */
+/* */
+/* ISRs */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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! */
-;
+
+ /* Context is already saved - just return. */
+
BX lr
-;}
+// }
END
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_control.s b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_control.s
index 2c8bf932..c0d9d095 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_control.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_control.s
@@ -1,77 +1,78 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_interrupt_control Cortex-M3/IAR */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;UINT _tx_thread_interrupt_control(UINT new_posture)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_interrupt_control Cortex-Mx/IAR */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
-;
-;}
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r1, BASEPRI // Pickup current interrupt posture
+ MSR BASEPRI, r0 // Apply the new interrupt posture
+ MOV r0, r1 // Transfer old to return register
+#else
+ MRS r1, PRIMASK // Pickup current interrupt lockout
+ MSR PRIMASK, r0 // Apply the new interrupt lockout
+ MOV r0, r1 // Transfer old to return register
+#endif
+ BX lr // Return to caller
+// }
END
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_disable.s b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_disable.s
index af919f6f..86fcf188 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_disable.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_disable.s
@@ -1,76 +1,78 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_interrupt_restore Cortex-M3/IAR */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;UINT _tx_thread_interrupt_disable(UINT new_posture)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_interrupt_disable Cortex-Mx/IAR */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is responsible for disabling interrupts and returning */
+/* the previous interrupt lockout posture. */
+/* */
+/* INPUT */
+/* */
+/* None */
+/* */
+/* OUTPUT */
+/* */
+/* old_posture Old interrupt lockout posture */
+/* */
+/* CALLS */
+/* */
+/* None */
+/* */
+/* CALLED BY */
+/* */
+/* Application Code */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// UINT _tx_thread_interrupt_disable(VOID)
+// {
PUBLIC _tx_thread_interrupt_disable
_tx_thread_interrupt_disable:
-;
-; /* Return current interrupt lockout posture. */
-;
+ /* Return current interrupt lockout posture. */
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r0, BASEPRI
+ LDR r1, =TX_PORT_BASEPRI
+ MSR BASEPRI, r1
+#else
MRS r0, PRIMASK
CPSID i
+#endif
BX lr
-;
-;}
+// }
END
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_restore.s b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_restore.s
index a10b571f..f9603de1 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_restore.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_interrupt_restore.s
@@ -1,75 +1,75 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_interrupt_restore Cortex-M3/IAR */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_interrupt_restore(UINT new_posture)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_interrupt_restore Cortex-Mx/IAR */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is responsible for restoring the previous */
+/* interrupt lockout posture. */
+/* */
+/* INPUT */
+/* */
+/* previous_posture Previous interrupt posture */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* None */
+/* */
+/* CALLED BY */
+/* */
+/* Application Code */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// VOID _tx_thread_interrupt_restore(UINT previous_posture)
+// {
PUBLIC _tx_thread_interrupt_restore
_tx_thread_interrupt_restore:
-;
-; /* Restore previous interrupt lockout posture. */
-;
+ /* Restore previous interrupt lockout posture. */
+#ifdef TX_PORT_USE_BASEPRI
+ MSR BASEPRI, r0
+#else
MSR PRIMASK, r0
+#endif
BX lr
-;
-;}
+// }
END
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_schedule.s b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_schedule.s
index 7d212b73..ec87d06e 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_schedule.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_schedule.s
@@ -1,521 +1,524 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
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
EXTERN _txm_module_manager_memory_fault_handler
EXTERN _txm_module_manager_memory_fault_info
-;
-;
+
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_schedule Cortex-M3/MPU/IAR */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* Scott Larson, 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 */
-;/* */
-;/* 09-30-2020 Scott Larson Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_schedule(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_schedule Cortex-M3/MPU/IAR */
+/* 6.1 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 09-30-2020 Scott Larson Initial Version 6.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 memory fault registers. */
-;
- LDR r0, =0xE000ED24 ; Build SHCSR address
- LDR r1, =0x70000 ; Enable Usage, Bus, and MemManage faults
- STR r1, [r0] ;
-;
-; /* Enable interrupts */
-;
+
+ /* This function should only ever be called on Cortex-M
+ from the first schedule request. Subsequent scheduling occurs
+ from the PendSV handling routine 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 memory fault registers. */
+
+ LDR r0, =0xE000ED24 // Build SHCSR address
+ LDR r1, =0x70000 // Enable Usage, Bus, and MemManage faults
+ STR r1, [r0] //
+
+ /* 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. */
+ /* 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
-;}
-;
+ B __tx_wait_here // Wait for the PendSV to happen
+// }
+
+
+ /* Memory Exception Handler. */
-;
-; /* Memory Exception Handler. */
-;
PUBLIC MemManage_Handler
PUBLIC BusFault_Handler
PUBLIC UsageFault_Handler
MemManage_Handler:
BusFault_Handler:
UsageFault_Handler:
-;{
- CPSID i ; Disable interrupts
-;
-; /* Now pickup and store all the fault related information. */
-;
- LDR r12,=_txm_module_manager_memory_fault_info ; Pickup fault info struct
- LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r1, [r0] ; Pickup the current thread pointer
- STR r1, [r12, #0] ; Save current thread pointer in fault info structure
- LDR r0, =0xE000ED24 ; Build SHCSR address
- LDR r1, [r0] ; Pickup SHCSR
- STR r1, [r12, #8] ; Save SHCSR
- LDR r0, =0xE000ED28 ; Build CFSR address
- LDR r1, [r0] ; Pickup CFSR
- STR r1, [r12, #12] ; Save CFSR
- LDR r0, =0xE000ED34 ; Build MMFAR address
- LDR r1, [r0] ; Pickup MMFAR
- STR r1, [r12, #16] ; Save MMFAR
- LDR r0, =0xE000ED38 ; Build BFAR address
- LDR r1, [r0] ; Pickup BFAR
- STR r1, [r12, #20] ; Save BFAR
- MRS r0, CONTROL ; Pickup current CONTROL register
- STR r0, [r12, #24] ; Save CONTROL
- MRS r1, PSP ; Pickup thread stack pointer
- STR r1, [r12, #28] ; Save thread stack pointer
- LDR r0, [r1] ; Pickup saved r0
- STR r0, [r12, #32] ; Save r0
- LDR r0, [r1, #4] ; Pickup saved r1
- STR r0, [r12, #36] ; Save r1
- STR r2, [r12, #40] ; Save r2
- STR r3, [r12, #44] ; Save r3
- STR r4, [r12, #48] ; Save r4
- STR r5, [r12, #52] ; Save r5
- STR r6, [r12, #56] ; Save r6
- STR r7, [r12, #60] ; Save r7
- STR r8, [r12, #64] ; Save r8
- STR r9, [r12, #68] ; Save r9
- STR r10,[r12, #72] ; Save r10
- STR r11,[r12, #76] ; Save r11
- LDR r0, [r1, #16] ; Pickup saved r12
- STR r0, [r12, #80] ; Save r12
- LDR r0, [r1, #20] ; Pickup saved lr
- STR r0, [r12, #84] ; Save lr
- LDR r0, [r1, #24] ; Pickup instruction address at point of fault
- STR r0, [r12, #4] ; Save point of fault
- LDR r0, [r1, #28] ; Pickup xPSR
- STR r0, [r12, #88] ; Save xPSR
- MRS r0, CONTROL ; Pickup current CONTROL register
- BIC r0, r0, #1 ; Clear the UNPRIV bit
- MSR CONTROL, r0 ; Setup new CONTROL register
+ CPSID i // Disable interrupts
+
+ /* Now pickup and store all the fault related information. */
+
+ LDR r12,=_txm_module_manager_memory_fault_info // Pickup fault info struct
+ LDR r0, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r1, [r0] // Pickup the current thread pointer
+ STR r1, [r12, #0] // Save current thread pointer in fault info structure
+ LDR r0, =0xE000ED24 // Build SHCSR address
+ LDR r1, [r0] // Pickup SHCSR
+ STR r1, [r12, #8] // Save SHCSR
+ LDR r0, =0xE000ED28 // Build CFSR address
+ LDR r1, [r0] // Pickup CFSR
+ STR r1, [r12, #12] // Save CFSR
+ LDR r0, =0xE000ED34 // Build MMFAR address
+ LDR r1, [r0] // Pickup MMFAR
+ STR r1, [r12, #16] // Save MMFAR
+ LDR r0, =0xE000ED38 // Build BFAR address
+ LDR r1, [r0] // Pickup BFAR
+ STR r1, [r12, #20] // Save BFAR
+ MRS r0, CONTROL // Pickup current CONTROL register
+ STR r0, [r12, #24] // Save CONTROL
+ MRS r1, PSP // Pickup thread stack pointer
+ STR r1, [r12, #28] // Save thread stack pointer
+ LDR r0, [r1] // Pickup saved r0
+ STR r0, [r12, #32] // Save r0
+ LDR r0, [r1, #4] // Pickup saved r1
+ STR r0, [r12, #36] // Save r1
+ STR r2, [r12, #40] // Save r2
+ STR r3, [r12, #44] // Save r3
+ STR r4, [r12, #48] // Save r4
+ STR r5, [r12, #52] // Save r5
+ STR r6, [r12, #56] // Save r6
+ STR r7, [r12, #60] // Save r7
+ STR r8, [r12, #64] // Save r8
+ STR r9, [r12, #68] // Save r9
+ STR r10,[r12, #72] // Save r10
+ STR r11,[r12, #76] // Save r11
+ LDR r0, [r1, #16] // Pickup saved r12
+ STR r0, [r12, #80] // Save r12
+ LDR r0, [r1, #20] // Pickup saved lr
+ STR r0, [r12, #84] // Save lr
+ LDR r0, [r1, #24] // Pickup instruction address at point of fault
+ STR r0, [r12, #4] // Save point of fault
+ LDR r0, [r1, #28] // Pickup xPSR
+ STR r0, [r12, #88] // Save xPSR
+
+ MRS r0, CONTROL // Pickup current CONTROL register
+ BIC r0, r0, #1 // Clear the UNPRIV bit
+ MSR CONTROL, r0 // Setup new CONTROL register
- LDR r0, =0xE000ED28 ; Build the Memory Management Fault Status Register (MMFSR)
- LDRB r1, [r0] ; Pickup the MMFSR, with the following bit definitions:
- ; Bit 0 = 1 -> Instruction address violation
- ; Bit 1 = 1 -> Load/store address violation
- ; Bit 7 = 1 -> MMFAR is valid
- STRB r1, [r0] ; Clear the MMFSR
+ LDR r0, =0xE000ED28 // Build the Memory Management Fault Status Register (MMFSR)
+ LDRB r1, [r0] // Pickup the MMFSR, with the following bit definitions:
+ // Bit 0 = 1 -> Instruction address violation
+ // Bit 1 = 1 -> Load/store address violation
+ // Bit 7 = 1 -> MMFAR is valid
+ STRB r1, [r0] // Clear the MMFSR
- BL _txm_module_manager_memory_fault_handler ; Call memory manager fault handler
+ BL _txm_module_manager_memory_fault_handler // Call memory manager fault handler
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-;
-; /* Call the thread exit function to indicate the thread is no longer executing. */
-;
- CPSID i ; Disable interrupts
- BL _tx_execution_thread_exit ; Call the thread exit function
- CPSIE i ; Enable interrupts
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* Call the thread exit function to indicate the thread is no longer executing. */
+ CPSID i // Disable interrupts
+ BL _tx_execution_thread_exit // Call the thread exit function
+ CPSIE i // Enable interrupts
#endif
- MOV r1, #0 ; Build NULL value
- LDR r0, =_tx_thread_current_ptr ; Pickup address of current thread pointer
- STR r1, [r0] ; Clear current thread pointer
+ MOV r1, #0 // Build NULL value
+ LDR r0, =_tx_thread_current_ptr // Pickup address of current thread pointer
+ STR r1, [r0] // Clear current thread pointer
- ; Return from MemManage_Handler exception
- LDR r0, =0xE000ED04 ; Load ICSR
- LDR r1, =0x10000000 ; Set PENDSVSET bit
- STR r1, [r0] ; Store ICSR
- DSB ; Wait for memory access to complete
- CPSIE i ; Enable interrupts
- MOV lr, #0xFFFFFFFD ; Load exception return code
- BX lr ; Return from exception
-;}
+ // Return from MemManage_Handler exception
+ LDR r0, =0xE000ED04 // Load ICSR
+ LDR r1, =0x10000000 // Set PENDSVSET bit
+ STR r1, [r0] // Store ICSR
+ DSB // Wait for memory access to complete
+ CPSIE i // Enable interrupts
+ MOV lr, #0xFFFFFFFD // Load exception return code
+ BX lr // Return from exception
+
+
+ /* Generic context PendSV handler. */
-;
-; /* Generic context PendSV handler. */
-;
PUBLIC PendSV_Handler
PUBLIC __tx_PendSVHandler
PendSV_Handler:
__tx_PendSVHandler:
-;
-; /* Get current thread value and new thread pointer. */
-;
+
+ /* 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
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* 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!!! */
-;
+
+ LDR r0, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR 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
+ LDR 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. */
-;
+
+ /* 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
+ 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
+ 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. */
-#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
-;
-; /* Call the thread entry function to indicate the thread is executing. */
-;
- PUSH {r0, r1} ; Save r0 and r1
- BL _tx_execution_thread_enter ; Call the thread execution enter function
- POP {r0, r1} ; Recover r0 and r1
+ STR r5, [r4] // Setup global time-slice
+
+#if (defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE))
+ /* Call the thread entry function to indicate the thread is executing. */
+ PUSH {r0, r1} // Save r0 and r1
+ BL _tx_execution_thread_enter // Call the thread execution enter function
+ POP {r0, r1} // Recover r0 and r1
#endif
-;
-; /* Restore the thread context and PSP. */
-;
- LDR r12, [r1, #8] ; Pickup thread's stack pointer
- MRS r5, CONTROL ; Pickup current CONTROL register
- LDR r4, [r1, #0x98] ; Pickup current user mode flag
- BIC r5, r5, #1 ; Clear the UNPRIV bit
- ORR r4, r4, r5 ; Build new CONTROL register
- MSR CONTROL, r4 ; Setup new CONTROL register
+ /* Restore the thread context and PSP. */
+
+ LDR r12, [r1, #8] // Pickup thread's stack pointer
- LDR r0, =0xE000ED94 ; Build MPU control reg address
- MOV r3, #0 ; Build disable value
- STR r3, [r0] ; Disable MPU
- LDR r0, [r1, #0x90] ; Pickup the module instance pointer
- CBZ r0, skip_mpu_setup ; Is this thread owned by a module? No, skip MPU setup
- LDR r1, [r0, #0x64] ; Pickup MPU register[0]
- CBZ r1, skip_mpu_setup ; Is protection required for this module? No, skip MPU setup
- LDR r1, =0xE000ED9C ; Build address of MPU base register
+ MRS r5, CONTROL // Pickup current CONTROL register
+ LDR r4, [r1, #0x98] // Pickup current user mode flag
+ BIC r5, r5, #1 // Clear the UNPRIV bit
+ ORR r4, r4, r5 // Build new CONTROL register
+ MSR CONTROL, r4 // Setup new CONTROL register
- ; Use alias registers to quickly load MPU
- ADD r0, r0, #100 ; Build address of MPU register start in thread control block
- LDM r0!,{r2-r9} ; Load first four MPU regions
- STM r1,{r2-r9} ; Store first four MPU regions
- LDM r0,{r2-r9} ; Load second four MPU regions
- STM r1,{r2-r9} ; Store second four MPU regions
- LDR r0, =0xE000ED94 ; Build MPU control reg address
- MOV r1, #5 ; Build enable value with background region enabled
- STR r1, [r0] ; Enable MPU
+ LDR r0, =0xE000ED94 // Build MPU control reg address
+ MOV r3, #0 // Build disable value
+ STR r3, [r0] // Disable MPU
+ LDR r0, [r1, #0x90] // Pickup the module instance pointer
+ CBZ r0, skip_mpu_setup // Is this thread owned by a module? No, skip MPU setup
+ LDR r1, [r0, #0x64] // Pickup MPU register[0]
+ CBZ r1, skip_mpu_setup // Is protection required for this module? No, skip MPU setup
+ LDR r1, =0xE000ED9C // Build address of MPU base register
+
+ // Use alias registers to quickly load MPU
+ ADD r0, r0, #100 // Build address of MPU register start in thread control block
+ LDM r0!,{r2-r9} // Load first four MPU regions
+ STM r1,{r2-r9} // Store first four MPU regions
+ LDM r0,{r2-r9} // Load second four MPU regions
+ STM r1,{r2-r9} // Store second four MPU regions
+ LDR r0, =0xE000ED94 // Build MPU control reg address
+ MOV r1, #5 // Build enable value with background region enabled
+ STR r1, [r0] // Enable MPU
skip_mpu_setup:
- 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. */
-;
+ 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!
+ 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_LOW_POWER
+ PUSH {r0-r3}
+ BL tx_low_power_enter // Possibly enter low power mode
+ POP {r0-r3}
+#endif
+
#ifdef TX_ENABLE_WFI
- DSB ; Ensure no outstanding memory transactions
- WFI ; Wait for interrupt
- ISB ; Ensure pipeline is flushed
+ 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! */
-;
+
+#ifdef TX_LOW_POWER
+ PUSH {r0-r3}
+ BL tx_low_power_exit // Exit low power mode
+ POP {r0-r3}
+#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
-;}
+ 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
+// }
+
+
+ /* SVC Handler. */
-;
-; /* SVC Handler. */
-;
PUBLIC SVC_Handler
PUBLIC __tx_SVCallHandler
SVC_Handler:
__tx_SVCallHandler:
-;{
- MRS r0, PSP ; Pickup the PSP stack
- LDR r1, [r0, #24] ; Pickup the point of interrupt
- LDRB r2, [r1, #-2] ; Pickup the SVC parameter
- ;
- ; Determine which SVC trap we are processing
- ;
- CMP r2, #1 ; Is it the entry into ThreadX?
- BNE _tx_thread_user_return ; No, return to user mode
- ;
- ; At this point we have an SVC 1, which means we are entering the kernel from a module thread with user mode selected
- ;
- LDR r2, =_txm_module_priv-1 ; Subtract 1 because of THUMB mode.
- CMP r1, r2 ; Did we come from user_mode_entry?
- IT NE ; If no (not equal), then...
- BXNE lr ; return from where we came.
- LDR r3, [r0, #20] ; This is the saved LR
- LDR r1, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r2, [r1] ; Pickup current thread pointer
- MOV r1, #0 ; Build clear value
- STR r1, [r2, #0x98] ; Clear the current user mode selection for thread
- STR r3, [r2, #0xA0] ; Save the original LR in thread control block
+ MRS r0, PSP // Pickup the PSP stack
+ LDR r1, [r0, #24] // Pickup the point of interrupt
+ LDRB r2, [r1, #-2] // Pickup the SVC parameter
+
+ /* Determine which SVC trap we are processing */
+
+ CMP r2, #1 // Is it the entry into ThreadX?
+ BNE _tx_thread_user_return // No, return to user mode
+
+ /* At this point we have an SVC 1, which means we are entering
+ the kernel from a module thread with user mode selected. */
- ; If there is memory protection, use kernel stack
- LDR r0, [r2, #0x90] ; Load the module instance ptr
- LDR r0, [r0, #0x0C] ; Load the module property flags
- TST r0, #2 ; Check if memory protected
+ LDR r2, =_txm_module_priv-1 // Load address of where we should have come from
+ // Subtract 1 because of THUMB mode.
+ CMP r1, r2 // Did we come from user_mode_entry?
+ IT NE // If no (not equal), then...
+ BXNE lr // return from where we came.
+
+ LDR r3, [r0, #20] // This is the saved LR
+ LDR r1, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r2, [r1] // Pickup current thread pointer
+ MOV r1, #0 // Build clear value
+ STR r1, [r2, #0x98] // Clear the current user mode selection for thread
+ STR r3, [r2, #0xA0] // Save the original LR in thread control block
+
+ /* If there is memory protection, use kernel stack */
+ LDR r0, [r2, #0x90] // Load the module instance ptr
+ LDR r0, [r0, #0x0C] // Load the module property flags
+ TST r0, #2 // Check if memory protected
BEQ _tx_skip_kernel_stack_enter
- ; Switch to the module thread's kernel stack
- LDR r0, [r2, #0xA8] ; Load the module kernel stack end
+ /* Switch to the module thread's kernel stack */
+ LDR r0, [r2, #0xA8] // Load the module kernel stack end
#ifndef TXM_MODULE_KERNEL_STACK_MAINTENANCE_DISABLE
- LDR r1, [r2, #0xA4] ; Load the module kernel stack start
- LDR r3, [r2, #0xAC] ; Load the module kernel stack size
- STR r1, [r2, #12] ; Set stack start
- STR r0, [r2, #16] ; Set stack end
- STR r3, [r2, #20] ; Set stack size
+ LDR r1, [r2, #0xA4] // Load the module kernel stack start
+ LDR r3, [r2, #0xAC] // Load the module kernel stack size
+ STR r1, [r2, #12] // Set stack start
+ STR r0, [r2, #16] // Set stack end
+ STR r3, [r2, #20] // Set stack size
#endif
- MRS r3, PSP ; Pickup thread stack pointer
- STR r3, [r2, #0xB0] ; Save thread stack pointer
+ MRS r3, PSP // Pickup thread stack pointer
+ STR r3, [r2, #0xB0] // Save thread stack pointer
- ; Build kernel stack by copying thread stack two registers at a time
- ADD r3, r3, #32 ; start at bottom of hardware stack
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
- LDMDB r3!,{r1-r2}
- STMDB r0!,{r1-r2}
+ /* Build kernel stack by copying thread stack two registers at a time */
+ ADD r3, r3, #32 // Start at bottom of hardware stack
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
+ LDMDB r3!, {r1-r2}
+ STMDB r0!, {r1-r2}
- MSR PSP, r0 ; Set kernel stack pointer
+ MSR PSP, r0 // Set kernel stack pointer
_tx_skip_kernel_stack_enter:
- MRS r0, CONTROL ; Pickup current CONTROL register
- BIC r0, r0, #1 ; Clear the UNPRIV bit
- MSR CONTROL, r0 ; Setup new CONTROL register
- BX lr ; Return to thread
+ MRS r0, CONTROL // Pickup current CONTROL register
+ BIC r0, r0, #1 // Clear the UNPRIV bit
+ MSR CONTROL, r0 // Setup new CONTROL register
+ BX lr // Return to thread
_tx_thread_user_return:
- LDR r2, =_txm_module_user_mode_exit-1 ; Subtract 1 because of THUMB mode.
- CMP r1, r2 ; Did we come from user_mode_exit?
- IT NE ; If no (not equal), then...
- BXNE lr ; return from where we came
+ LDR r2, =_txm_module_user_mode_exit-1 // Load address of where we should have come from
+ // Subtract 1 because of THUMB mode.
+ CMP r1, r2 // Did we come from user_mode_exit?
+ IT NE // If no (not equal), then...
+ BXNE lr // return from where we came
- LDR r1, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r2, [r1] ; Pickup current thread pointer
- LDR r1, [r2, #0x9C] ; Pick up user mode
- STR r1, [r2, #0x98] ; Set the current user mode selection for thread
+ LDR r1, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r2, [r1] // Pickup current thread pointer
+ LDR r1, [r2, #0x9C] // Pick up user mode
+ STR r1, [r2, #0x98] // Set the current user mode selection for thread
- ; If there is memory protection, use kernel stack
- LDR r0, [r2, #0x90] ; Load the module instance ptr
- LDR r0, [r0, #0x0C] ; Load the module property flags
- TST r0, #2 ; Check if memory protected
+ /* If there is memory protection, use kernel stack */
+ LDR r0, [r2, #0x90] // Load the module instance ptr
+ LDR r0, [r0, #0x0C] // Load the module property flags
+ TST r0, #2 // Check if memory protected
BEQ _tx_skip_kernel_stack_exit
#ifndef TXM_MODULE_KERNEL_STACK_MAINTENANCE_DISABLE
- LDR r0, [r2, #0xB4] ; Load the module thread stack start
- LDR r1, [r2, #0xB8] ; Load the module thread stack end
- LDR r3, [r2, #0xBC] ; Load the module thread stack size
- STR r0, [r2, #12] ; Set stack start
- STR r1, [r2, #16] ; Set stack end
- STR r3, [r2, #20] ; Set stack size
+ LDR r0, [r2, #0xB4] // Load the module thread stack start
+ LDR r1, [r2, #0xB8] // Load the module thread stack end
+ LDR r3, [r2, #0xBC] // Load the module thread stack size
+ STR r0, [r2, #12] // Set stack start
+ STR r1, [r2, #16] // Set stack end
+ STR r3, [r2, #20] // Set stack size
#endif
- LDR r0, [r2, #0xB0] ; Load the module thread stack pointer
- MRS r3, PSP ; Pickup kernel stack pointer
+ LDR r0, [r2, #0xB0] // Load the module thread stack pointer
+ MRS r3, PSP // Pickup kernel stack pointer
- ; Copy kernel hardware stack to module thread stack.
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- LDM r3!,{r1-r2}
- STM r0!,{r1-r2}
- SUB r0, r0, #32 ; Subtract 32 to get back to top of stack
- MSR PSP, r0 ; Set thread stack pointer
+ /* Copy kernel hardware stack to module thread stack. */
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ LDM r3!, {r1-r2}
+ STM r0!, {r1-r2}
+ SUB r0, r0, #32 // Subtract 32 to get back to top of stack
+ MSR PSP, r0 // Set thread stack pointer
- LDR r1, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r2, [r1] ; Pickup current thread pointer
- LDR r1, [r2, #0x9C] ; Pick up user mode
+ LDR r1, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r2, [r1] // Pickup current thread pointer
+ LDR r1, [r2, #0x9C] // Pick up user mode
_tx_skip_kernel_stack_exit:
- MRS r0, CONTROL ; Pickup current CONTROL register
- ORR r0, r0, r1 ; OR in the user mode bit
- MSR CONTROL, r0 ; Setup new CONTROL register
- BX lr ; Return to thread
-;}
+ MRS r0, CONTROL // Pickup current CONTROL register
+ ORR r0, r0, r1 // OR in the user mode bit
+ MSR CONTROL, r0 // Setup new CONTROL register
+ BX lr // Return to thread
+
+
+ /* Kernel entry function from user mode. */
-;
-; /* Kernel entry function from user mode. */
-;
EXTERN _txm_module_manager_kernel_dispatch
-;
SECTION `.text`:CODE:NOROOT(5)
THUMB
ALIGNROM 5
-;VOID _txm_module_manager_user_mode_entry(VOID)
-;{
+// VOID _txm_module_manager_user_mode_entry(VOID)
+// {
PUBLIC _txm_module_manager_user_mode_entry
_txm_module_manager_user_mode_entry:
- SVC 1 ; Enter kernel
+ SVC 1 // Enter kernel
_txm_module_priv:
- ; At this point, we are out of user mode. The original LR has been saved in the
- ; thread control block. Simply call the kernel dispatch function.
+ /* At this point, we are out of user mode. The original LR has been saved in the
+ thread control block. Simply call the kernel dispatch function. */
BL _txm_module_manager_kernel_dispatch
- ; Pickup the original LR value while still in privileged mode
- LDR r2, =_tx_thread_current_ptr ; Build current thread pointer address
- LDR r3, [r2] ; Pickup current thread pointer
- LDR lr, [r3, #0xA0] ; Pickup saved LR from original call
+ /* Pickup the original LR value while still in privileged mode */
+ LDR r2, =_tx_thread_current_ptr // Build current thread pointer address
+ LDR r3, [r2] // Pickup current thread pointer
+ LDR lr, [r3, #0xA0] // Pickup saved LR from original call
- SVC 2 ; Exit kernel and return to user mode
+ SVC 2 // Exit kernel and return to user mode
_txm_module_user_mode_exit:
- BX lr ; Return to the caller
+ BX lr // Return to the caller
NOP
NOP
NOP
NOP
-;}
+// }
END
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_stack_build.s b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_stack_build.s
index e5f23bc5..dcc82bf6 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_stack_build.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_stack_build.s
@@ -1,134 +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 */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_stack_build Cortex-M3/IAR */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_stack_build Cortex-Mx/IAR */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
-;}
+
+ /* 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_module/cortex_m3/iar/module_manager/src/tx_thread_system_return.s b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_system_return.s
index 38fb892b..4c5cb6fb 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_thread_system_return.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_thread_system_return.s
@@ -1,87 +1,92 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Thread */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _tx_thread_system_return Cortex-M3/IAR */
-;/* 6.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_thread_system_return(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_system_return Cortex-Mx/IAR */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
+
+ /* 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
+#ifdef TX_PORT_USE_BASEPRI
+ MRS r1, BASEPRI // Thread context returning, pickup BASEPRI
+ MOV r0, #0
+ MSR BASEPRI, r0 // Enable interrupts
+ MSR BASEPRI, r1 // Restore original interrupt posture
+#else
+ MRS r1, PRIMASK // Thread context returning, pickup PRIMASK
+ CPSIE i // Enable interrupts
+ MSR PRIMASK, r1 // Restore original interrupt posture
+#endif
_isr_context:
- BX lr ; Return to caller
-;}
+ BX lr // Return to caller
+// }
END
diff --git a/ports_module/cortex_m3/iar/module_manager/src/tx_timer_interrupt.s b/ports_module/cortex_m3/iar/module_manager/src/tx_timer_interrupt.s
index 58303af0..aa209956 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/tx_timer_interrupt.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/tx_timer_interrupt.s
@@ -1,26 +1,25 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the 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 */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the 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 */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
EXTERN _tx_timer_time_slice
EXTERN _tx_timer_system_clock
EXTERN _tx_timer_current_ptr
@@ -33,224 +32,221 @@
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.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 */
-;/* */
-;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _tx_timer_interrupt(VOID)
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_timer_interrupt Cortex-Mx/IAR */
+/* 6.1.8 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* */
+/* 08-02-2021 Scott Larson Initial Version 6.1.8 */
+/* */
+/**************************************************************************/
+// 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
-;
-; }
-;
+
+ /* 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
+ 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
+ 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?
+ // 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)
-; {
-;
- 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
-; {
+
+ /* 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
+ 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;
+
+ 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)
-;
- 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
-;
+
+ /* 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
-; }
-;
+
+ 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
-;
+
+ /* 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
+ CBNZ r2, __tx_something_expired // Did a time-slice expire?
+ // 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
+ 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
-;
-; }
+
+ 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
+ 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
+ /* 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
+ 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
+ LDR 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
+ 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:
-;
- LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for
- ; the 8-byte stack alignment
-;
-; }
-;
+
+ 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
-;
-;}
+ DSB // Complete all memory access
+ BX lr // Return to caller
+// }
END
diff --git a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_alignment_adjust.c b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_alignment_adjust.c
index fab10684..173cd9ca 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_alignment_adjust.c
+++ b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_alignment_adjust.c
@@ -61,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_power_of_two_block_size(ULONG size)
@@ -128,7 +128,7 @@ ULONG _txm_power_of_two_block_size(ULONG size)
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_alignment_adjust(TXM_MODULE_PREAMBLE *module_preamble,
diff --git a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_external_memory_enable.c b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_external_memory_enable.c
index 7eaa53df..2f6b20bd 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_external_memory_enable.c
+++ b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_external_memory_enable.c
@@ -70,7 +70,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
UINT _txm_module_manager_external_memory_enable(TXM_MODULE_INSTANCE *module_instance,
diff --git a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_handler.c b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_handler.c
index e516ffc4..8fdeb79f 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_handler.c
+++ b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_handler.c
@@ -76,7 +76,7 @@ TXM_MODULE_MANAGER_FAULT_INFO
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_memory_fault_handler(VOID)
diff --git a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_notify.c b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_notify.c
index ac9d7dd7..8df56b6a 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_notify.c
+++ b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_memory_fault_notify.c
@@ -71,7 +71,7 @@ extern VOID (*_txm_module_manager_fault_notify)(TX_THREAD *, TXM_MODULE_INSTA
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
UINT _txm_module_manager_memory_fault_notify(VOID (*notify_function)(TX_THREAD *, TXM_MODULE_INSTANCE *))
diff --git a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_mm_register_setup.c b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_mm_register_setup.c
index 83aad68f..c51db309 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_mm_register_setup.c
+++ b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_mm_register_setup.c
@@ -61,7 +61,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_module_manager_region_size_get(ULONG block_size)
@@ -184,7 +184,7 @@ ULONG return_value;
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
ULONG _txm_module_manager_calculate_srd_bits(ULONG block_size, ULONG length)
@@ -261,7 +261,7 @@ UINT srd_bit_index;
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
/* */
/**************************************************************************/
VOID _txm_module_manager_mm_register_setup(TXM_MODULE_INSTANCE *module_instance)
diff --git a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_thread_stack_build.s b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_thread_stack_build.s
index 2158c319..4c0a49ec 100644
--- a/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_thread_stack_build.s
+++ b/ports_module/cortex_m3/iar/module_manager/src/txm_module_manager_thread_stack_build.s
@@ -1,141 +1,138 @@
-;/**************************************************************************/
-;/* */
-;/* Copyright (c) Microsoft Corporation. All rights reserved. */
-;/* */
-;/* This software is licensed under the Microsoft Software License */
-;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
-;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
-;/* and in the root directory of this software. */
-;/* */
-;/**************************************************************************/
-;
-;
-;/**************************************************************************/
-;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
-;/** */
-;/** Module Manager */
-;/** */
-;/**************************************************************************/
-;/**************************************************************************/
-;
-;
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Module Manager */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
SECTION `.text`:CODE:NOROOT(2)
THUMB
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
-;/* _txm_module_manager_thread_stack_build Cortex-M3/MPU/IAR */
-;/* 6.1 */
-;/* AUTHOR */
-;/* */
-;/* Scott Larson, 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 */
-;/* function_ptr Pointer to shell function */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* None */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* _tx_thread_create Create thread service */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
-;/* DATE NAME DESCRIPTION */
-;/* */
-;/* 09-30-2020 Scott Larson Initial Version 6.1 */
-;/* */
-;/**************************************************************************/
-;VOID _txm_module_manager_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(TX_THREAD *, TXM_MODULE_INSTANCE *))
-;{
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _txm_module_manager_thread_stack_build Cortex-M3/MPU/IAR */
+/* 6.1 */
+/* AUTHOR */
+/* */
+/* Scott Larson, 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 */
+/* function_ptr Pointer to shell function */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* None */
+/* */
+/* CALLED BY */
+/* */
+/* _tx_thread_create Create thread service */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 09-30-2020 Scott Larson Initial Version 6.1 */
+/* */
+/**************************************************************************/
+// VOID _txm_module_manager_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(TX_THREAD *, TXM_MODULE_INSTANCE *))
+// {
PUBLIC _txm_module_manager_thread_stack_build
_txm_module_manager_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
- 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, #28] ; Store initial r10
- STR r3, [r2, #32] ; Store initial r11
-;
-; /* Hardware stack follows. */
-;
- STR r0, [r2, #36] ; Store initial r0, which is the thread control block
- LDR r3, [r0, #8] ; Pickup thread entry info pointer,which is in the stack pointer position of the thread control block.
- ; It was setup in the txm_module_manager_thread_create function. It will be overwritten later in this
- ; function with the actual, initial stack pointer.
- STR r3, [r2, #40] ; Store initial r1, which is the module entry information.
- LDR r3, [r3, #8] ; Pickup data base register from the module information
- STR r3, [r2, #24] ; Store initial r9 (data base register)
- MOV r3, #0 ; Clear r3 again
+ /* 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:
- 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
+ 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
+ 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, #28] // Store initial r10
+ STR r3, [r2, #32] // Store initial r11
+
+ /* Hardware stack follows. */
+
+ STR r0, [r2, #36] // Store initial r0, which is the thread control block
+
+ LDR r3, [r0, #8] // Pickup thread entry info pointer,which is in the stack pointer position of the thread control block.
+ // It was setup in the txm_module_manager_thread_create function. It will be overwritten later in this
+ // function with the actual, initial stack pointer.
+ STR r3, [r2, #40] // Store initial r1, which is the module entry information.
+ LDR r3, [r3, #8] // Pickup data base register from the module information
+ STR r3, [r2, #24] // Store initial r9 (data base register)
+ MOV r3, #0 // Clear r3 again
+
+ 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