6.1 minor release

This commit is contained in:
Scott Larson
2020-09-30 15:42:41 -07:00
parent 7287542cc8
commit 1b5816a206
3038 changed files with 377204 additions and 8606 deletions

View File

@@ -116,7 +116,7 @@ Reset_Vector
;/* FUNCTION RELEASE */
;/* */
;/* _tx_initialize_low_level Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -149,7 +149,7 @@ Reset_Vector
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_initialize_low_level(VOID)

View File

@@ -26,7 +26,7 @@
/* PORT SPECIFIC C INFORMATION RELEASE */
/* */
/* tx_port.h Cortex-A9/AC5 */
/* 6.0.1 */
/* 6.1 */
/* */
/* AUTHOR */
/* */
@@ -47,7 +47,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
@@ -324,7 +324,7 @@ void tx_thread_vfp_disable(void);
#ifdef TX_THREAD_INIT
CHAR _tx_version_id[] =
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/AC5 Version 6.0 *";
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/AC5 Version 6.1 *";
#else
extern CHAR _tx_version_id[];
#endif

View File

@@ -535,7 +535,7 @@ For generic code revision information, please refer to the readme_threadx_generi
file, which is included in your distribution. The following details the revision
information associated with this specific port of ThreadX:
06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A9 using AC5 tools.
09-30-2020 Initial ThreadX 6.1 version for Cortex-A9 using AC5 tools.
Copyright(c) 1996-2020 Microsoft Corporation

View File

@@ -60,7 +60,7 @@ SVC_MODE EQU 0x93 ; SVC mode
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_context_restore Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -92,7 +92,7 @@ SVC_MODE EQU 0x93 ; SVC mode
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_context_restore(VOID)

View File

@@ -45,7 +45,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_context_save Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -76,7 +76,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_context_save(VOID)

View File

@@ -56,7 +56,7 @@ IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_fiq_context_restore Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -88,7 +88,7 @@ IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_fiq_context_restore(VOID)

View File

@@ -45,7 +45,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_fiq_context_save Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -76,7 +76,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
; VOID _tx_thread_fiq_context_save(VOID)

View File

@@ -45,7 +45,7 @@ FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_fiq_nesting_end Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -84,7 +84,7 @@ FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_fiq_nesting_end(VOID)

View File

@@ -41,7 +41,7 @@ SYS_MODE_BITS EQU 0x1F ; System mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_fiq_nesting_start Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -77,7 +77,7 @@ SYS_MODE_BITS EQU 0x1F ; System mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_fiq_nesting_start(VOID)

View File

@@ -42,7 +42,7 @@ INT_MASK EQU 0x80 ; Interrupt bit mask
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_interrupt_control Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -72,7 +72,7 @@ INT_MASK EQU 0x80 ; Interrupt bit mask
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;UINT _tx_thread_interrupt_control(UINT new_posture)

View File

@@ -35,7 +35,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_interrupt_disable Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -64,7 +64,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;UINT _tx_thread_interrupt_disable(void)

View File

@@ -35,7 +35,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_interrupt_restore Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -65,7 +65,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;UINT _tx_thread_interrupt_restore(UINT old_posture)

View File

@@ -45,7 +45,7 @@ IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_irq_nesting_end Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -84,7 +84,7 @@ IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_irq_nesting_end(VOID)

View File

@@ -41,7 +41,7 @@ SYS_MODE_BITS EQU 0x1F ; System mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_irq_nesting_start Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -77,7 +77,7 @@ SYS_MODE_BITS EQU 0x1F ; System mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_irq_nesting_start(VOID)

View File

@@ -46,7 +46,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_schedule Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -79,7 +79,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_schedule(VOID)

View File

@@ -47,7 +47,7 @@ THUMB_BIT EQU 0x20 ; Thumb-bit
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_stack_build Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -79,7 +79,7 @@ THUMB_BIT EQU 0x20 ; Thumb-bit
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))

View File

@@ -45,7 +45,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_system_return Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -77,7 +77,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_system_return(VOID)

View File

@@ -44,7 +44,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_vectored_context_save Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -75,7 +75,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_vectored_context_save(VOID)

View File

@@ -50,7 +50,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_timer_interrupt Cortex-A9/AC5 */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -84,7 +84,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_timer_interrupt(VOID)

View File

@@ -75,7 +75,7 @@ $_tx_initialize_low_level:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_initialize_low_level Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -108,7 +108,7 @@ $_tx_initialize_low_level:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_initialize_low_level(VOID)

View File

@@ -26,7 +26,7 @@
/* PORT SPECIFIC C INFORMATION RELEASE */
/* */
/* tx_port.h Cortex-A9/AC6 */
/* 6.0.1 */
/* 6.1 */
/* */
/* AUTHOR */
/* */
@@ -47,7 +47,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
@@ -313,7 +313,7 @@ void tx_thread_vfp_disable(void);
#ifdef TX_THREAD_INIT
CHAR _tx_version_id[] =
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/AC6 Version 6.0.1 *";
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/AC6 Version 6.1 *";
#else
extern CHAR _tx_version_id[];
#endif

View File

@@ -332,7 +332,7 @@ For generic code revision information, please refer to the readme_threadx_generi
file, which is included in your distribution. The following details the revision
information associated with this specific port of ThreadX:
06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A9 using AC6 tools.
09-30-2020 Initial ThreadX 6.1 version for Cortex-A9 using AC6 tools.
Copyright(c) 1996-2020 Microsoft Corporation

View File

@@ -59,7 +59,7 @@ IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_context_restore Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -91,7 +91,7 @@ IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_context_restore(VOID)

View File

@@ -47,7 +47,7 @@
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_context_save Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -78,7 +78,7 @@
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_context_save(VOID)

View File

@@ -58,7 +58,7 @@ IRQ_MODE_BITS = 0x12 @ IRQ mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_fiq_context_restore Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -90,7 +90,7 @@ IRQ_MODE_BITS = 0x12 @ IRQ mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_fiq_context_restore(VOID)

View File

@@ -46,7 +46,7 @@
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_fiq_context_save Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -77,7 +77,7 @@
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@ VOID _tx_thread_fiq_context_save(VOID)

View File

@@ -50,7 +50,7 @@ FIQ_MODE_BITS = 0x11 @ FIQ mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_fiq_nesting_end Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -89,7 +89,7 @@ FIQ_MODE_BITS = 0x11 @ FIQ mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_fiq_nesting_end(VOID)

View File

@@ -46,7 +46,7 @@ SYS_MODE_BITS = 0x1F @ System mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_fiq_nesting_start Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -82,7 +82,7 @@ SYS_MODE_BITS = 0x1F @ System mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_fiq_nesting_start(VOID)

View File

@@ -56,7 +56,7 @@ $_tx_thread_interrupt_control:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_interrupt_control Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -86,7 +86,7 @@ $_tx_thread_interrupt_control:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@UINT _tx_thread_interrupt_control(UINT new_posture)

View File

@@ -53,7 +53,7 @@ $_tx_thread_interrupt_disable:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_interrupt_disable Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -82,7 +82,7 @@ $_tx_thread_interrupt_disable:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@UINT _tx_thread_interrupt_disable(void)

View File

@@ -53,7 +53,7 @@ $_tx_thread_interrupt_restore:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_interrupt_restore Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -83,7 +83,7 @@ $_tx_thread_interrupt_restore:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@UINT _tx_thread_interrupt_restore(UINT old_posture)

View File

@@ -50,7 +50,7 @@ IRQ_MODE_BITS = 0x12 @ IRQ mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_irq_nesting_end Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -89,7 +89,7 @@ IRQ_MODE_BITS = 0x12 @ IRQ mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_irq_nesting_end(VOID)

View File

@@ -46,7 +46,7 @@ SYS_MODE_BITS = 0x1F @ System mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_irq_nesting_start Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -82,7 +82,7 @@ SYS_MODE_BITS = 0x1F @ System mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_irq_nesting_start(VOID)

View File

@@ -61,7 +61,7 @@ $_tx_thread_schedule:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_schedule Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -94,7 +94,7 @@ $_tx_thread_schedule:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_schedule(VOID)

View File

@@ -64,7 +64,7 @@ $_tx_thread_stack_build:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_stack_build Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -96,7 +96,7 @@ $_tx_thread_stack_build:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))

View File

@@ -63,7 +63,7 @@ $_tx_thread_system_return:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_system_return Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -95,7 +95,7 @@ $_tx_thread_system_return:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_system_return(VOID)

View File

@@ -46,7 +46,7 @@
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_vectored_context_save Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -77,7 +77,7 @@
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_vectored_context_save(VOID)

View File

@@ -71,7 +71,7 @@ $_tx_timer_interrupt:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_timer_interrupt Cortex-A9/AC6 */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -105,7 +105,7 @@ $_tx_timer_interrupt:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_timer_interrupt(VOID)

View File

@@ -78,7 +78,7 @@ $_tx_initialize_low_level:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_initialize_low_level Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -111,7 +111,7 @@ $_tx_initialize_low_level:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_initialize_low_level(VOID)

View File

@@ -26,7 +26,7 @@
/* PORT SPECIFIC C INFORMATION RELEASE */
/* */
/* tx_port.h Cortex-A9/GNU */
/* 6.0.1 */
/* 6.1 */
/* */
/* AUTHOR */
/* */
@@ -47,7 +47,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
@@ -313,7 +313,7 @@ void tx_thread_vfp_disable(void);
#ifdef TX_THREAD_INIT
CHAR _tx_version_id[] =
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/GNU Version 6.0 *";
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/GNU Version 6.1 *";
#else
extern CHAR _tx_version_id[];
#endif

View File

@@ -503,7 +503,7 @@ For generic code revision information, please refer to the readme_threadx_generi
file, which is included in your distribution. The following details the revision
information associated with this specific port of ThreadX:
06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A9 using GNU tools.
09-30-2020 Initial ThreadX 6.1 version for Cortex-A9 using GNU tools.
Copyright(c) 1996-2020 Microsoft Corporation

View File

@@ -60,7 +60,7 @@ IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_context_restore Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -92,7 +92,7 @@ IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_context_restore(VOID)

View File

@@ -48,7 +48,7 @@
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_context_save Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -79,7 +79,7 @@
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_context_save(VOID)

View File

@@ -59,7 +59,7 @@ IRQ_MODE_BITS = 0x12 @ IRQ mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_fiq_context_restore Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -91,7 +91,7 @@ IRQ_MODE_BITS = 0x12 @ IRQ mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_fiq_context_restore(VOID)

View File

@@ -47,7 +47,7 @@
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_fiq_context_save Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -78,7 +78,7 @@
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@ VOID _tx_thread_fiq_context_save(VOID)

View File

@@ -50,7 +50,7 @@ FIQ_MODE_BITS = 0x11 @ FIQ mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_fiq_nesting_end Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -89,7 +89,7 @@ FIQ_MODE_BITS = 0x11 @ FIQ mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_fiq_nesting_end(VOID)

View File

@@ -46,7 +46,7 @@ SYS_MODE_BITS = 0x1F @ System mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_fiq_nesting_start Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -82,7 +82,7 @@ SYS_MODE_BITS = 0x1F @ System mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_fiq_nesting_start(VOID)

View File

@@ -56,7 +56,7 @@ $_tx_thread_interrupt_control:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_interrupt_control Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -86,7 +86,7 @@ $_tx_thread_interrupt_control:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@UINT _tx_thread_interrupt_control(UINT new_posture)

View File

@@ -53,7 +53,7 @@ $_tx_thread_interrupt_disable:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_interrupt_disable Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -82,7 +82,7 @@ $_tx_thread_interrupt_disable:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@UINT _tx_thread_interrupt_disable(void)

View File

@@ -53,7 +53,7 @@ $_tx_thread_interrupt_restore:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_interrupt_restore Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -83,7 +83,7 @@ $_tx_thread_interrupt_restore:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@UINT _tx_thread_interrupt_restore(UINT old_posture)

View File

@@ -50,7 +50,7 @@ IRQ_MODE_BITS = 0x12 @ IRQ mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_irq_nesting_end Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -89,7 +89,7 @@ IRQ_MODE_BITS = 0x12 @ IRQ mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_irq_nesting_end(VOID)

View File

@@ -46,7 +46,7 @@ SYS_MODE_BITS = 0x1F @ System mode bits
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_irq_nesting_start Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -82,7 +82,7 @@ SYS_MODE_BITS = 0x1F @ System mode bits
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_irq_nesting_start(VOID)

View File

@@ -62,7 +62,7 @@ $_tx_thread_schedule:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_schedule Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -95,7 +95,7 @@ $_tx_thread_schedule:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_schedule(VOID)

View File

@@ -64,7 +64,7 @@ $_tx_thread_stack_build:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_stack_build Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -96,7 +96,7 @@ $_tx_thread_stack_build:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))

View File

@@ -64,7 +64,7 @@ $_tx_thread_system_return:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_system_return Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -96,7 +96,7 @@ $_tx_thread_system_return:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_system_return(VOID)

View File

@@ -47,7 +47,7 @@
@/* FUNCTION RELEASE */
@/* */
@/* _tx_thread_vectored_context_save Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -78,7 +78,7 @@
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_thread_vectored_context_save(VOID)

View File

@@ -71,7 +71,7 @@ $_tx_timer_interrupt:
@/* FUNCTION RELEASE */
@/* */
@/* _tx_timer_interrupt Cortex-A9/GNU */
@/* 6.0.1 */
@/* 6.1 */
@/* AUTHOR */
@/* */
@/* William E. Lamie, Microsoft Corporation */
@@ -105,7 +105,7 @@ $_tx_timer_interrupt:
@/* */
@/* DATE NAME DESCRIPTION */
@/* */
@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@/* */
@/**************************************************************************/
@VOID _tx_timer_interrupt(VOID)

View File

@@ -0,0 +1,12 @@
#!gbuild
primaryTarget=arm_standalone.tgt
[Project]
-bsp generic
-G
-cpu=cortexa9
-littleendian
sample_threadx.gpj [Program]
sample_threadx_el.gpj [Program]
tx.gpj [Library]
txe.gpj [Library]
..\readme_threadx.txt

View File

@@ -0,0 +1,45 @@
#
#
#/* Define the Cortex-A9 vector area. This should be located or copied to 0. */
#
.section ".reset", .text
.globl __vectors
__vectors:
B __entry # Reset goes to the entry function
LDR pc,UNDEFINED # Undefined handler
LDR pc,SWI # Software interrupt handler
LDR pc,PREFETCH # Prefetch exception handler
LDR pc,ABORT # Abort exception handler
LDR pc,RESERVED # Reserved exception handler
LDR pc,IRQ # IRQ interrupt handler
LDR pc,FIQ # FIQ interrupt handler
#
#
__entry:
LDR sp,STACK # Setup stack pointer
LDR pc,START # Jump to Green Hills startup
#
#
STACK:
.data.w __ghsend_stack
START:
.data.w _start # Reset goes to startup function
UNDEFINED:
.data.w __tx_undefined # Undefined handler
SWI:
.data.w __tx_swi_interrupt # Software interrupt handler
PREFETCH:
.data.w __tx_prefetch_handler # Prefetch exception handler
ABORT:
.data.w __tx_abort_handler # Abort exception handler
RESERVED:
.data.w __tx_reserved_handler # Reserved exception handler
IRQ:
.data.w __tx_irq_handler # IRQ interrupt handler
FIQ:
.data.w __tx_fiq_handler # FIQ interrupt handler
#
#
.type __vectors,$function
.size __vectors,.-__vectors

View File

@@ -0,0 +1,369 @@
/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight
threads of different priorities, using a message queue, semaphore, mutex, event flags group,
byte pool, and block pool. */
#include "tx_api.h"
#define DEMO_STACK_SIZE 1024
#define DEMO_BYTE_POOL_SIZE 9120
#define DEMO_BLOCK_POOL_SIZE 100
#define DEMO_QUEUE_SIZE 100
/* Define the ThreadX object control blocks... */
TX_THREAD thread_0;
TX_THREAD thread_1;
TX_THREAD thread_2;
TX_THREAD thread_3;
TX_THREAD thread_4;
TX_THREAD thread_5;
TX_THREAD thread_6;
TX_THREAD thread_7;
TX_QUEUE queue_0;
TX_SEMAPHORE semaphore_0;
TX_MUTEX mutex_0;
TX_EVENT_FLAGS_GROUP event_flags_0;
TX_BYTE_POOL byte_pool_0;
TX_BLOCK_POOL block_pool_0;
/* Define the counters used in the demo application... */
ULONG thread_0_counter;
ULONG thread_1_counter;
ULONG thread_1_messages_sent;
ULONG thread_2_counter;
ULONG thread_2_messages_received;
ULONG thread_3_counter;
ULONG thread_4_counter;
ULONG thread_5_counter;
ULONG thread_6_counter;
ULONG thread_7_counter;
/* Define thread prototypes. */
void thread_0_entry(ULONG thread_input);
void thread_1_entry(ULONG thread_input);
void thread_2_entry(ULONG thread_input);
void thread_3_and_4_entry(ULONG thread_input);
void thread_5_entry(ULONG thread_input);
void thread_6_and_7_entry(ULONG thread_input);
/* Define main entry point. */
int main()
{
/* Enter the ThreadX kernel. */
tx_kernel_enter();
}
/* Define what the initial system looks like. */
void tx_application_define(void *first_unused_memory)
{
CHAR *pointer = TX_NULL;
/* Create a byte memory pool from which to allocate the thread stacks. */
tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE);
/* Put system definition stuff in here, e.g. thread creates and other assorted
create information. */
/* Allocate the stack for thread 0. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
/* Create the main thread. */
tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,
pointer, DEMO_STACK_SIZE,
1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
/* Allocate the stack for thread 1. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
/* Create threads 1 and 2. These threads pass information through a ThreadX
message queue. It is also interesting to note that these threads have a time
slice. */
tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1,
pointer, DEMO_STACK_SIZE,
16, 16, 4, TX_AUTO_START);
/* Allocate the stack for thread 2. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2,
pointer, DEMO_STACK_SIZE,
16, 16, 4, TX_AUTO_START);
/* Allocate the stack for thread 3. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
/* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore.
An interesting thing here is that both threads share the same instruction area. */
tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3,
pointer, DEMO_STACK_SIZE,
8, 8, TX_NO_TIME_SLICE, TX_AUTO_START);
/* Allocate the stack for thread 4. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4,
pointer, DEMO_STACK_SIZE,
8, 8, TX_NO_TIME_SLICE, TX_AUTO_START);
/* Allocate the stack for thread 5. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
/* Create thread 5. This thread simply pends on an event flag which will be set
by thread_0. */
tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5,
pointer, DEMO_STACK_SIZE,
4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
/* Allocate the stack for thread 6. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
/* Create threads 6 and 7. These threads compete for a ThreadX mutex. */
tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6,
pointer, DEMO_STACK_SIZE,
8, 8, TX_NO_TIME_SLICE, TX_AUTO_START);
/* Allocate the stack for thread 7. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7,
pointer, DEMO_STACK_SIZE,
8, 8, TX_NO_TIME_SLICE, TX_AUTO_START);
/* Allocate the message queue. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT);
/* Create the message queue shared by threads 1 and 2. */
tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG));
/* Create the semaphore used by threads 3 and 4. */
tx_semaphore_create(&semaphore_0, "semaphore 0", 1);
/* Create the event flags group used by threads 1 and 5. */
tx_event_flags_create(&event_flags_0, "event flags 0");
/* Create the mutex used by thread 6 and 7 without priority inheritance. */
tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT);
/* Allocate the memory for a small block pool. */
tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT);
/* Create a block memory pool to allocate a message buffer from. */
tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE);
/* Allocate a block and release the block memory. */
tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT);
/* Release the block back to the pool. */
tx_block_release(pointer);
}
/* Define the test threads. */
void thread_0_entry(ULONG thread_input)
{
UINT status;
/* This thread simply sits in while-forever-sleep loop. */
while(1)
{
/* Increment the thread counter. */
thread_0_counter++;
/* Sleep for 10 ticks. */
tx_thread_sleep(10);
/* Set event flag 0 to wakeup thread 5. */
status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR);
/* Check status. */
if (status != TX_SUCCESS)
break;
}
}
void thread_1_entry(ULONG thread_input)
{
UINT status;
/* This thread simply sends messages to a queue shared by thread 2. */
while(1)
{
/* Increment the thread counter. */
thread_1_counter++;
/* Send message to queue 0. */
status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER);
/* Check completion status. */
if (status != TX_SUCCESS)
break;
/* Increment the message sent. */
thread_1_messages_sent++;
}
}
void thread_2_entry(ULONG thread_input)
{
ULONG received_message;
UINT status;
/* This thread retrieves messages placed on the queue by thread 1. */
while(1)
{
/* Increment the thread counter. */
thread_2_counter++;
/* Retrieve a message from the queue. */
status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER);
/* Check completion status and make sure the message is what we
expected. */
if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received))
break;
/* Otherwise, all is okay. Increment the received message count. */
thread_2_messages_received++;
}
}
void thread_3_and_4_entry(ULONG thread_input)
{
UINT status;
/* This function is executed from thread 3 and thread 4. As the loop
below shows, these function compete for ownership of semaphore_0. */
while(1)
{
/* Increment the thread counter. */
if (thread_input == 3)
thread_3_counter++;
else
thread_4_counter++;
/* Get the semaphore with suspension. */
status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER);
/* Check status. */
if (status != TX_SUCCESS)
break;
/* Sleep for 2 ticks to hold the semaphore. */
tx_thread_sleep(2);
/* Release the semaphore. */
status = tx_semaphore_put(&semaphore_0);
/* Check status. */
if (status != TX_SUCCESS)
break;
}
}
void thread_5_entry(ULONG thread_input)
{
UINT status;
ULONG actual_flags;
/* This thread simply waits for an event in a forever loop. */
while(1)
{
/* Increment the thread counter. */
thread_5_counter++;
/* Wait for event flag 0. */
status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR,
&actual_flags, TX_WAIT_FOREVER);
/* Check status. */
if ((status != TX_SUCCESS) || (actual_flags != 0x1))
break;
}
}
void thread_6_and_7_entry(ULONG thread_input)
{
UINT status;
/* This function is executed from thread 6 and thread 7. As the loop
below shows, these function compete for ownership of mutex_0. */
while(1)
{
/* Increment the thread counter. */
if (thread_input == 6)
thread_6_counter++;
else
thread_7_counter++;
/* Get the mutex with suspension. */
status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER);
/* Check status. */
if (status != TX_SUCCESS)
break;
/* Get the mutex again with suspension. This shows
that an owning thread may retrieve the mutex it
owns multiple times. */
status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER);
/* Check status. */
if (status != TX_SUCCESS)
break;
/* Sleep for 2 ticks to hold the mutex. */
tx_thread_sleep(2);
/* Release the mutex. */
status = tx_mutex_put(&mutex_0);
/* Check status. */
if (status != TX_SUCCESS)
break;
/* Release the mutex again. This will actually
release ownership since it was obtained twice. */
status = tx_mutex_put(&mutex_0);
/* Check status. */
if (status != TX_SUCCESS)
break;
}
}

View File

@@ -0,0 +1,11 @@
target_connection.00000000.title="Simulator connection for ThreadX"
target_connection.00000000.type="Custom"
target_connection.00000000.short_type="Custom"
target_connection.00000000.args="simarm -cpu=cortexa9 -fpu -rom"
target_connection.00000000.command="simarm -cpu=cortexa9 -fpu -rom"
target_connection.00000000.logfile=""
target_connection.00000000.mode="download"
target_connection.00000000.setup_script=""
target_connection.00000000.sane="yes"
target_connection.00000000.log="no"
target_connection.00000000.timestamp="1192825758"

View File

@@ -0,0 +1,11 @@
#!gbuild
[Program]
-I../../../../common/inc
-I../../../../ports_common_green/inc
-I../inc
reset.arm
tx_initialize_low_level.arm
sample_threadx.c
tx.a
sample_threadx.ld
sample_threadx.con

View File

@@ -0,0 +1,44 @@
# The following explains what the default Green Hills sections are for:
#
# picbase - base of the text sections, relocatable in -pic mode
# text - text section
# syscall - syscall section, for host I/O under Multi
# fixaddr/fixtype - for PIC/PID fixups
# rodata - read only data
# romdata - the ROM image of .data
# romsdata - the ROM image of .sdata
# secinfo - section information section, used by the start-up code
# pidbase - base of the data sections, relocatable in -pid mode
# sdabase - base of the small data area section pointer
# sbss - small BSS (zeroed data) section
# sdata - small data section
# data - non-zeroed writeable data section
# bss - zeroed data section
# heap - the heap, grows upward
# stack - the stack, grows downward
-sec
{
.reset 0x000000 :
.picbase 0x1000 :
.text :
.comment :
.intercall :
.interfunc :
.syscall :
.fixaddr :
.fixtype :
.rodata :
.romdata ROM(.data) :
.romsdata ROM(.sdata) :
.secinfo :
.pidbase align(16) :
.sdabase :
.sbss :
.sdata :
.data :
.bss :
.heap align(16) pad(0x10000) :
.stack align(16) pad(0x1000) :
.free_mem align(16) pad(0x10000) :
}

View File

@@ -0,0 +1,13 @@
#!gbuild
[Program]
-DTX_ENABLE_EVENT_LOGGING
-I../../../../common/inc
-I../../../../ports_common_green/inc
-I../inc
reset.arm
tx_initialize_low_level.arm
sample_threadx.c
txe.a
sample_threadx_el.ld
sample_threadx.con
readme_threadx.txt

View File

@@ -0,0 +1,45 @@
# The following explains what the default Green Hills sections are for:
#
# picbase - base of the text sections, relocatable in -pic mode
# text - text section
# syscall - syscall section, for host I/O under Multi
# fixaddr/fixtype - for PIC/PID fixups
# rodata - read only data
# romdata - the ROM image of .data
# romsdata - the ROM image of .sdata
# secinfo - section information section, used by the start-up code
# pidbase - base of the data sections, relocatable in -pid mode
# sdabase - base of the small data area section pointer
# sbss - small BSS (zeroed data) section
# sdata - small data section
# data - non-zeroed writeable data section
# bss - zeroed data section
# heap - the heap, grows upward
# stack - the stack, grows downward
-sec
{
.reset 0x000000 :
.picbase 0x1000 :
.text :
.comment :
.intercall :
.interfunc :
.syscall :
.fixaddr :
.fixtype :
.rodata :
.romdata ROM(.data) :
.romsdata ROM(.sdata) :
.secinfo :
.pidbase align(16) :
.sdabase :
.sbss :
.sdata :
.data :
.bss :
.heap align(16) pad(0x1000) :
.stack align(16) pad(0x1000) :
.eventlog align(16) pad(0x10000) :
.free_mem align(16) pad(0x10000) :
}

View File

@@ -0,0 +1,283 @@
#!gbuild
[Library]
-I../../../../common/inc
-I../../../../ports_common_green/inc
-I../inc
..\..\..\..\common\inc\tx_api.h
..\..\..\..\common\inc\tx_block_pool.h
..\..\..\..\common\inc\tx_byte_pool.h
..\..\..\..\common\inc\tx_event_flags.h
..\..\..\..\common\inc\tx_initialize.h
..\..\..\..\common\inc\tx_mutex.h
..\..\..\..\common\inc\tx_queue.h
..\..\..\..\common\inc\tx_semaphore.h
..\..\..\..\common\inc\tx_thread.h
..\..\..\..\common\inc\tx_timer.h
..\..\..\..\common\inc\tx_trace.h
..\..\..\..\common\inc\tx_user_sample.h
..\inc\tx_port.h
..\..\..\..\ports_common_green\inc\tx_el.h
..\..\..\..\ports_common_green\inc\tx_ghs.h
..\src\tx_thread_context_restore.arm
..\src\tx_thread_context_save.arm
..\src\tx_thread_fiq_context_restore.arm
..\src\tx_thread_fiq_context_save.arm
..\src\tx_thread_fiq_nesting_end.arm
..\src\tx_thread_fiq_nesting_start.arm
..\src\tx_thread_interrupt_control.arm
..\src\tx_thread_interrupt_disable.arm
..\src\tx_thread_interrupt_restore.arm
..\src\tx_thread_irq_nesting_end.arm
..\src\tx_thread_irq_nesting_start.arm
..\src\tx_thread_schedule.arm
..\src\tx_thread_stack_build.arm
..\src\tx_thread_system_return.arm
..\src\tx_thread_vectored_context_save.arm
..\src\tx_timer_interrupt.arm
..\..\..\..\common\src\tx_block_allocate.c
..\..\..\..\common\src\tx_block_pool_cleanup.c
..\..\..\..\common\src\tx_block_pool_create.c
..\..\..\..\common\src\tx_block_pool_delete.c
..\..\..\..\common\src\tx_block_pool_info_get.c
..\..\..\..\common\src\tx_block_pool_initialize.c
..\..\..\..\common\src\tx_block_pool_performance_info_get.c
..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c
..\..\..\..\common\src\tx_block_pool_prioritize.c
..\..\..\..\common\src\tx_block_release.c
..\..\..\..\common\src\tx_byte_allocate.c
..\..\..\..\common\src\tx_byte_pool_cleanup.c
..\..\..\..\common\src\tx_byte_pool_create.c
..\..\..\..\common\src\tx_byte_pool_delete.c
..\..\..\..\common\src\tx_byte_pool_info_get.c
..\..\..\..\common\src\tx_byte_pool_initialize.c
..\..\..\..\common\src\tx_byte_pool_performance_info_get.c
..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c
..\..\..\..\common\src\tx_byte_pool_prioritize.c
..\..\..\..\common\src\tx_byte_pool_search.c
..\..\..\..\common\src\tx_byte_release.c
..\..\..\..\common\src\tx_event_flags_cleanup.c
..\..\..\..\common\src\tx_event_flags_create.c
..\..\..\..\common\src\tx_event_flags_delete.c
..\..\..\..\common\src\tx_event_flags_get.c
..\..\..\..\common\src\tx_event_flags_info_get.c
..\..\..\..\common\src\tx_event_flags_initialize.c
..\..\..\..\common\src\tx_event_flags_performance_info_get.c
..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c
..\..\..\..\common\src\tx_event_flags_set.c
..\..\..\..\common\src\tx_event_flags_set_notify.c
..\..\..\..\common\src\tx_initialize_high_level.c
..\..\..\..\common\src\tx_initialize_kernel_enter.c
..\..\..\..\common\src\tx_initialize_kernel_setup.c
..\..\..\..\common\src\tx_mutex_cleanup.c
..\..\..\..\common\src\tx_mutex_create.c
..\..\..\..\common\src\tx_mutex_delete.c
..\..\..\..\common\src\tx_mutex_get.c
..\..\..\..\common\src\tx_mutex_info_get.c
..\..\..\..\common\src\tx_mutex_initialize.c
..\..\..\..\common\src\tx_mutex_performance_info_get.c
..\..\..\..\common\src\tx_mutex_performance_system_info_get.c
..\..\..\..\common\src\tx_mutex_prioritize.c
..\..\..\..\common\src\tx_mutex_priority_change.c
..\..\..\..\common\src\tx_mutex_put.c
..\..\..\..\common\src\tx_queue_cleanup.c
..\..\..\..\common\src\tx_queue_create.c
..\..\..\..\common\src\tx_queue_delete.c
..\..\..\..\common\src\tx_queue_flush.c
..\..\..\..\common\src\tx_queue_front_send.c
..\..\..\..\common\src\tx_queue_info_get.c
..\..\..\..\common\src\tx_queue_initialize.c
..\..\..\..\common\src\tx_queue_performance_info_get.c
..\..\..\..\common\src\tx_queue_performance_system_info_get.c
..\..\..\..\common\src\tx_queue_prioritize.c
..\..\..\..\common\src\tx_queue_receive.c
..\..\..\..\common\src\tx_queue_send.c
..\..\..\..\common\src\tx_queue_send_notify.c
..\..\..\..\common\src\tx_semaphore_ceiling_put.c
..\..\..\..\common\src\tx_semaphore_cleanup.c
..\..\..\..\common\src\tx_semaphore_create.c
..\..\..\..\common\src\tx_semaphore_delete.c
..\..\..\..\common\src\tx_semaphore_get.c
..\..\..\..\common\src\tx_semaphore_info_get.c
..\..\..\..\common\src\tx_semaphore_initialize.c
..\..\..\..\common\src\tx_semaphore_performance_info_get.c
..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c
..\..\..\..\common\src\tx_semaphore_prioritize.c
..\..\..\..\common\src\tx_semaphore_put.c
..\..\..\..\common\src\tx_semaphore_put_notify.c
..\..\..\..\common\src\tx_thread_create.c
..\..\..\..\common\src\tx_thread_delete.c
..\..\..\..\common\src\tx_thread_entry_exit_notify.c
..\..\..\..\common\src\tx_thread_identify.c
..\..\..\..\common\src\tx_thread_info_get.c
..\..\..\..\common\src\tx_thread_initialize.c
..\..\..\..\common\src\tx_thread_performance_info_get.c
..\..\..\..\common\src\tx_thread_performance_system_info_get.c
..\..\..\..\common\src\tx_thread_preemption_change.c
..\..\..\..\common\src\tx_thread_priority_change.c
..\..\..\..\common\src\tx_thread_relinquish.c
..\..\..\..\common\src\tx_thread_reset.c
..\..\..\..\common\src\tx_thread_resume.c
..\..\..\..\common\src\tx_thread_shell_entry.c
..\..\..\..\common\src\tx_thread_sleep.c
..\..\..\..\common\src\tx_thread_stack_analyze.c
..\..\..\..\common\src\tx_thread_stack_error_handler.c
..\..\..\..\common\src\tx_thread_stack_error_notify.c
..\..\..\..\common\src\tx_thread_suspend.c
..\..\..\..\common\src\tx_thread_system_preempt_check.c
..\..\..\..\common\src\tx_thread_system_resume.c
..\..\..\..\common\src\tx_thread_system_suspend.c
..\..\..\..\common\src\tx_thread_terminate.c
..\..\..\..\common\src\tx_thread_time_slice.c
..\..\..\..\common\src\tx_thread_time_slice_change.c
..\..\..\..\common\src\tx_thread_timeout.c
..\..\..\..\common\src\tx_thread_wait_abort.c
..\..\..\..\common\src\tx_time_get.c
..\..\..\..\common\src\tx_time_set.c
..\..\..\..\common\src\tx_timer_activate.c
..\..\..\..\common\src\tx_timer_change.c
..\..\..\..\common\src\tx_timer_create.c
..\..\..\..\common\src\tx_timer_deactivate.c
..\..\..\..\common\src\tx_timer_delete.c
..\..\..\..\common\src\tx_timer_expiration_process.c
..\..\..\..\common\src\tx_timer_info_get.c
..\..\..\..\common\src\tx_timer_initialize.c
..\..\..\..\common\src\tx_timer_performance_info_get.c
..\..\..\..\common\src\tx_timer_performance_system_info_get.c
..\..\..\..\common\src\tx_timer_system_activate.c
..\..\..\..\common\src\tx_timer_system_deactivate.c
..\..\..\..\common\src\tx_timer_thread_entry.c
..\..\..\..\common\src\tx_trace_buffer_full_notify.c
..\..\..\..\common\src\tx_trace_disable.c
..\..\..\..\common\src\tx_trace_enable.c
..\..\..\..\common\src\tx_trace_event_filter.c
..\..\..\..\common\src\tx_trace_event_unfilter.c
..\..\..\..\common\src\tx_trace_initialize.c
..\..\..\..\common\src\tx_trace_interrupt_control.c
..\..\..\..\common\src\tx_trace_isr_enter_insert.c
..\..\..\..\common\src\tx_trace_isr_exit_insert.c
..\..\..\..\common\src\tx_trace_object_register.c
..\..\..\..\common\src\tx_trace_object_unregister.c
..\..\..\..\common\src\tx_trace_user_event_insert.c
..\..\..\..\common\src\txe_block_allocate.c
..\..\..\..\common\src\txe_block_pool_create.c
..\..\..\..\common\src\txe_block_pool_delete.c
..\..\..\..\common\src\txe_block_pool_info_get.c
..\..\..\..\common\src\txe_block_pool_prioritize.c
..\..\..\..\common\src\txe_block_release.c
..\..\..\..\common\src\txe_byte_allocate.c
..\..\..\..\common\src\txe_byte_pool_create.c
..\..\..\..\common\src\txe_byte_pool_delete.c
..\..\..\..\common\src\txe_byte_pool_info_get.c
..\..\..\..\common\src\txe_byte_pool_prioritize.c
..\..\..\..\common\src\txe_byte_release.c
..\..\..\..\common\src\txe_event_flags_create.c
..\..\..\..\common\src\txe_event_flags_delete.c
..\..\..\..\common\src\txe_event_flags_get.c
..\..\..\..\common\src\txe_event_flags_info_get.c
..\..\..\..\common\src\txe_event_flags_set.c
..\..\..\..\common\src\txe_event_flags_set_notify.c
..\..\..\..\common\src\txe_mutex_create.c
..\..\..\..\common\src\txe_mutex_delete.c
..\..\..\..\common\src\txe_mutex_get.c
..\..\..\..\common\src\txe_mutex_info_get.c
..\..\..\..\common\src\txe_mutex_prioritize.c
..\..\..\..\common\src\txe_mutex_put.c
..\..\..\..\common\src\txe_queue_create.c
..\..\..\..\common\src\txe_queue_delete.c
..\..\..\..\common\src\txe_queue_flush.c
..\..\..\..\common\src\txe_queue_front_send.c
..\..\..\..\common\src\txe_queue_info_get.c
..\..\..\..\common\src\txe_queue_prioritize.c
..\..\..\..\common\src\txe_queue_receive.c
..\..\..\..\common\src\txe_queue_send.c
..\..\..\..\common\src\txe_queue_send_notify.c
..\..\..\..\common\src\txe_semaphore_ceiling_put.c
..\..\..\..\common\src\txe_semaphore_create.c
..\..\..\..\common\src\txe_semaphore_delete.c
..\..\..\..\common\src\txe_semaphore_get.c
..\..\..\..\common\src\txe_semaphore_info_get.c
..\..\..\..\common\src\txe_semaphore_prioritize.c
..\..\..\..\common\src\txe_semaphore_put.c
..\..\..\..\common\src\txe_semaphore_put_notify.c
..\..\..\..\common\src\txe_thread_create.c
..\..\..\..\common\src\txe_thread_delete.c
..\..\..\..\common\src\txe_thread_entry_exit_notify.c
..\..\..\..\common\src\txe_thread_info_get.c
..\..\..\..\common\src\txe_thread_preemption_change.c
..\..\..\..\common\src\txe_thread_priority_change.c
..\..\..\..\common\src\txe_thread_relinquish.c
..\..\..\..\common\src\txe_thread_reset.c
..\..\..\..\common\src\txe_thread_resume.c
..\..\..\..\common\src\txe_thread_suspend.c
..\..\..\..\common\src\txe_thread_terminate.c
..\..\..\..\common\src\txe_thread_time_slice_change.c
..\..\..\..\common\src\txe_thread_wait_abort.c
..\..\..\..\common\src\txe_timer_activate.c
..\..\..\..\common\src\txe_timer_change.c
..\..\..\..\common\src\txe_timer_create.c
..\..\..\..\common\src\txe_timer_deactivate.c
..\..\..\..\common\src\txe_timer_delete.c
..\..\..\..\common\src\txe_timer_info_get.c
..\..\..\..\ports_common_green\src\tx_el.c
..\..\..\..\ports_common_green\src\tx_ghs.c
..\..\..\..\ports_common_green\src\tx_ghse.c
..\..\..\..\ports_common_green\src\txr_block_allocate.c
..\..\..\..\ports_common_green\src\txr_block_pool_create.c
..\..\..\..\ports_common_green\src\txr_block_pool_delete.c
..\..\..\..\ports_common_green\src\txr_block_pool_info_get.c
..\..\..\..\ports_common_green\src\txr_block_pool_prioritize.c
..\..\..\..\ports_common_green\src\txr_block_release.c
..\..\..\..\ports_common_green\src\txr_byte_allocate.c
..\..\..\..\ports_common_green\src\txr_byte_pool_create.c
..\..\..\..\ports_common_green\src\txr_byte_pool_delete.c
..\..\..\..\ports_common_green\src\txr_byte_pool_info_get.c
..\..\..\..\ports_common_green\src\txr_byte_pool_prioritize.c
..\..\..\..\ports_common_green\src\txr_byte_release.c
..\..\..\..\ports_common_green\src\txr_event_flags_create.c
..\..\..\..\ports_common_green\src\txr_event_flags_delete.c
..\..\..\..\ports_common_green\src\txr_event_flags_get.c
..\..\..\..\ports_common_green\src\txr_event_flags_info_get.c
..\..\..\..\ports_common_green\src\txr_event_flags_set.c
..\..\..\..\ports_common_green\src\txr_event_flags_set_notify.c
..\..\..\..\ports_common_green\src\txr_ghs.c
..\..\..\..\ports_common_green\src\txr_mutex_create.c
..\..\..\..\ports_common_green\src\txr_mutex_delete.c
..\..\..\..\ports_common_green\src\txr_mutex_get.c
..\..\..\..\ports_common_green\src\txr_mutex_info_get.c
..\..\..\..\ports_common_green\src\txr_mutex_prioritize.c
..\..\..\..\ports_common_green\src\txr_mutex_put.c
..\..\..\..\ports_common_green\src\txr_queue_create.c
..\..\..\..\ports_common_green\src\txr_queue_delete.c
..\..\..\..\ports_common_green\src\txr_queue_flush.c
..\..\..\..\ports_common_green\src\txr_queue_front_send.c
..\..\..\..\ports_common_green\src\txr_queue_info_get.c
..\..\..\..\ports_common_green\src\txr_queue_prioritize.c
..\..\..\..\ports_common_green\src\txr_queue_receive.c
..\..\..\..\ports_common_green\src\txr_queue_send.c
..\..\..\..\ports_common_green\src\txr_queue_send_notify.c
..\..\..\..\ports_common_green\src\txr_semaphore_ceiling_put.c
..\..\..\..\ports_common_green\src\txr_semaphore_create.c
..\..\..\..\ports_common_green\src\txr_semaphore_delete.c
..\..\..\..\ports_common_green\src\txr_semaphore_get.c
..\..\..\..\ports_common_green\src\txr_semaphore_info_get.c
..\..\..\..\ports_common_green\src\txr_semaphore_prioritize.c
..\..\..\..\ports_common_green\src\txr_semaphore_put.c
..\..\..\..\ports_common_green\src\txr_semaphore_put_notify.c
..\..\..\..\ports_common_green\src\txr_thread_create.c
..\..\..\..\ports_common_green\src\txr_thread_delete.c
..\..\..\..\ports_common_green\src\txr_thread_entry_exit_notify.c
..\..\..\..\ports_common_green\src\txr_thread_info_get.c
..\..\..\..\ports_common_green\src\txr_thread_preemption_change.c
..\..\..\..\ports_common_green\src\txr_thread_priority_change.c
..\..\..\..\ports_common_green\src\txr_thread_reset.c
..\..\..\..\ports_common_green\src\txr_thread_resume.c
..\..\..\..\ports_common_green\src\txr_thread_suspend.c
..\..\..\..\ports_common_green\src\txr_thread_terminate.c
..\..\..\..\ports_common_green\src\txr_thread_time_slice_change.c
..\..\..\..\ports_common_green\src\txr_thread_wait_abort.c
..\..\..\..\ports_common_green\src\txr_timer_activate.c
..\..\..\..\ports_common_green\src\txr_timer_change.c
..\..\..\..\ports_common_green\src\txr_timer_create.c
..\..\..\..\ports_common_green\src\txr_timer_deactivate.c
..\..\..\..\ports_common_green\src\txr_timer_delete.c
..\..\..\..\ports_common_green\src\txr_timer_info_get.c

View File

@@ -0,0 +1,319 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Initialize */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_initialize.h"
#include "tx_thread.h"
#include "tx_timer.h" */
SVC_MODE = 0xD3 # Disable IRQ/FIQ SVC mode
IRQ_MODE = 0xD2 # Disable IRQ/FIQ IRQ mode
FIQ_MODE = 0xD1 # Disable IRQ/FIQ FIQ mode
SYS_MODE = 0xDF # Disable IRQ/FIQ SYS mode
MODE_MASK = 0x1F # Mode mask
FIQ_STACK_SIZE = 512 # FIQ stack size
IRQ_STACK_SIZE = 1024 # IRQ stack size
SYS_STACK_SIZE = 1024 # SYS stack size
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_initialize_low_level Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is responsible for any low-level processor */
/* initialization, including setting up interrupt vectors, setting */
/* up a periodic timer interrupt source, saving the system stack */
/* pointer for use in ISR processing later, and finding the first */
/* available RAM memory address for tx_application_define. */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _tx_initialize_kernel_enter ThreadX entry function */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
/* VOID _tx_initialize_low_level(VOID)
{ */
.globl _tx_initialize_low_level
_tx_initialize_low_level:
/****** NOTE ****** We must be in SVC MODE at this point. Some monitors
enter this routine in USER mode and require a software interrupt to
change into SVC mode. */
/* Save the system stack pointer. */
/* _tx_thread_system_stack_ptr = (VOID_PTR) (sp); */
LDR r1,=_tx_thread_system_stack_ptr # Pickup address of system stack ptr
STR sp, [r1] # Save system stack
/* Pickup the first available memory address. */
LDR r0,=__ghsbegin_free_mem # Pickup free memory address
/* Setup initial stack pointers for IRQ and FIQ modes. */
MRS r12, CPSR # Pickup current CPSR
MOV r1, r0 # Get first available memory
#ifdef TX_ENABLE_IRQ_NESTING
/* Setup the system mode stack for nested interrupt support */
LDR r2, =SYS_STACK_SIZE # Pickup stack size
BIC r3, r12, MODE_MASK # Clear mode bits
ORR r3, r3, SYS_MODE # Build SYS mode CPSR
MSR CPSR_c, r3 # Enter SYS mode
ADD r1, r1, r2 # Calculate start of SYS stack
SUB r1, r1, 1 # Backup one byte
BIC r1, r1, 7 # Insure 8-byte alignment
MOV sp, r1 # Setup SYS stack pointer
#endif
LDR r2, =FIQ_STACK_SIZE # Pickup stack size
BIC r3, r12, MODE_MASK # Clear mode bits
ORR r3, r3, FIQ_MODE # Build FIQ mode CPSR
MSR CPSR_c, r3 # Enter FIQ mode
ADD r1, r1, r2 # Calculate start of FIQ stack
SUB r1, r1, 1 # Backup one byte
BIC r1, r1, 7 # Insure 8-byte alignment
MOV sp, r1 # Setup FIQ stack pointer
MOV r10, 0 # Clear sl
MOV r11, 0 # Clear fp
LDR r2, =IRQ_STACK_SIZE # Pickup IRQ (system stack size)
BIC r3, r12, MODE_MASK # Clear mode bits
ORR r3, r3, IRQ_MODE # Build IRQ mode CPSR
MSR CPSR_c, r3 # Enter IRQ mode
ADD r1, r1, r2 # Calculate start of IRQ stack
SUB r1, r1, 1 # Backup one byte
BIC r1, r1, 7 # Insure 8-byte alignment
MOV sp, r1 # Setup IRQ stack pointer
MSR CPSR_c, r12 # Restore previous mode
ADD r0, r1, 4 # Adjust the new free memory
/* Save the first available memory address. */
/* _tx_initialize_unused_memory = (VOID_PTR) __ghsbegin_free_mem + [SYS_STACK] + FIQ_STACK + IRQ_STACK; */
LDR r2,=_tx_initialize_unused_memory # Pickup unused memory ptr address
STR r0, [r2] # Save first free memory address
/* Setup Timer for periodic interrupts. To generate timer interrupts with
the Green Hills simulator, enter the following command in the target
window: timer 9999 irq */
/* Done, return to caller. */
RET # Return to caller
.type _tx_initialize_low_level,$function
.size _tx_initialize_low_level,.-_tx_initialize_low_level
/* } */
/* Define shells for each of the interrupt vectors. */
.globl __tx_undefined
__tx_undefined:
B __tx_undefined # Undefined handler
.type __tx_undefined,$function
.size __tx_undefined,.-__tx_undefined
.globl __tx_swi_interrupt
__tx_swi_interrupt:
B __tx_swi_interrupt # Software interrupt handler
.type __tx_swi_interrupt,$function
.size __tx_swi_interrupt,.-__tx_swi_interrupt
.globl __tx_prefetch_handler
__tx_prefetch_handler:
B __tx_prefetch_handler # Prefetch exception handler
.type __tx_prefetch_handler,$function
.size __tx_prefetch_handler,.-__tx_prefetch_handler
.globl __tx_abort_handler
__tx_abort_handler:
B __tx_abort_handler # Abort exception handler
.type __tx_abort_handler,$function
.size __tx_abort_handler,.-__tx_abort_handler
.globl __tx_reserved_handler
__tx_reserved_handler:
B __tx_reserved_handler # Reserved exception handler
.type __tx_reserved_handler,$function
.size __tx_reserved_handler,.-__tx_reserved_handler
.globl __tx_irq_handler
.globl __tx_irq_processing_return
__tx_irq_handler:
/* Jump to context save to save system context. */
B _tx_thread_context_save
.type __tx_irq_handler,$function
.size __tx_irq_handler,.-__tx_irq_handler
__tx_irq_processing_return:
/* At this point execution is still in the IRQ mode. The CPSR, point of
interrupt, and all C scratch registers are available for use. */
#ifdef TX_ENABLE_EVENT_LOGGING
MOV r0, 0 # Build interrupt code
BL _tx_el_interrupt # Call interrupt event logging
#endif
/* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start
from IRQ mode with interrupts disabled. This routine switches to the
system mode and returns with IRQ interrupts enabled.
NOTE: It is very important to ensure all IRQ interrupts are cleared
prior to enabling nested IRQ interrupts. */
#ifdef TX_ENABLE_IRQ_NESTING
BL _tx_thread_irq_nesting_start
#endif
/* For debug purpose, execute the timer interrupt processing here. In
a real system, some kind of status indication would have to be checked
before the timer interrupt handler could be called. */
BL _tx_timer_interrupt # Timer interrupt handler
/* Application IRQ handlers can be called here! */
/* If interrupt nesting was started earlier, the end of interrupt nesting
service must be called before returning to _tx_thread_context_restore.
This routine returns in processing in IRQ mode with interrupts disabled. */
#ifdef TX_ENABLE_IRQ_NESTING
BL _tx_thread_irq_nesting_end
#endif
#ifdef TX_ENABLE_EVENT_LOGGING
MOV r0, 0 # Build interrupt code
BL _tx_el_interrupt_end # Call interrupt event logging
#endif
/* Jump to context restore to restore system context. */
B _tx_thread_context_restore
.type __tx_irq_processing_return,$function
.size __tx_irq_processing_return,.-__tx_irq_processing_return
#ifdef TX_ENABLE_FIQ_SUPPORT
.globl __tx_fiq_handler
.globl __tx_fiq_processing_return
__tx_fiq_handler:
/* Jump to fiq context save to save system context. */
B _tx_thread_fiq_context_save
.type __tx_fiq_handler,$function
.size __tx_fiq_handler,.-__tx_fiq_handler
__tx_fiq_processing_return:
/* At this point execution is still in the FIQ mode. The CPSR, point of
interrupt, and all C scratch registers are available for use. */
#ifdef TX_ENABLE_EVENT_LOGGING
MOV r0, 1 # Build interrupt code
BL _tx_el_interrupt # Call interrupt event logging
#endif
/* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start
from FIQ mode with interrupts disabled. This routine switches to the
system mode and returns with FIQ interrupts enabled.
NOTE: It is very important to ensure all FIQ interrupts are cleared
prior to enabling nested FIQ interrupts. */
#ifdef TX_ENABLE_FIQ_NESTING
BL _tx_thread_fiq_nesting_start
#endif
/* Application FIQ handlers can be called here! */
/* If interrupt nesting was started earlier, the end of interrupt nesting
service must be called before returning to _tx_thread_fiq_context_restore. */
#ifdef TX_ENABLE_FIQ_NESTING
BL _tx_thread_fiq_nesting_end
#endif
#ifdef TX_ENABLE_EVENT_LOGGING
MOV r0, 1 # Build interrupt code
BL _tx_el_interrupt_end # Call interrupt event logging
#endif
/* Jump to fiq context restore to restore system context. */
B _tx_thread_fiq_context_restore
.type __tx_fiq_processing_return,$function
.size __tx_fiq_processing_return,.-__tx_fiq_processing_return
#else
.globl __tx_fiq_handler
__tx_fiq_handler:
B __tx_fiq_handler # FIQ interrupt handler
.type __tx_fiq_handler,$function
.size __tx_fiq_handler,.-__tx_fiq_handler
#endif
/* Reference build options and version ID to ensure they come in. */
BUILD_OPTIONS:
.data.w _tx_build_options
VERSION_ID:
.data.w _tx_version_id

View File

@@ -0,0 +1,284 @@
#!gbuild
[Library]
-DTX_ENABLE_EVENT_LOGGING
-I../../../../common/inc
-I../../../../ports_common_green/inc
-I../inc
..\..\..\..\common\inc\tx_api.h
..\..\..\..\common\inc\tx_block_pool.h
..\..\..\..\common\inc\tx_byte_pool.h
..\..\..\..\common\inc\tx_event_flags.h
..\..\..\..\common\inc\tx_initialize.h
..\..\..\..\common\inc\tx_mutex.h
..\..\..\..\common\inc\tx_queue.h
..\..\..\..\common\inc\tx_semaphore.h
..\..\..\..\common\inc\tx_thread.h
..\..\..\..\common\inc\tx_timer.h
..\..\..\..\common\inc\tx_trace.h
..\..\..\..\common\inc\tx_user_sample.h
..\inc\tx_port.h
..\..\..\..\ports_common_green\inc\tx_el.h
..\..\..\..\ports_common_green\inc\tx_ghs.h
..\src\tx_thread_context_restore.arm
..\src\tx_thread_context_save.arm
..\src\tx_thread_fiq_context_restore.arm
..\src\tx_thread_fiq_context_save.arm
..\src\tx_thread_fiq_nesting_end.arm
..\src\tx_thread_fiq_nesting_start.arm
..\src\tx_thread_interrupt_control.arm
..\src\tx_thread_interrupt_disable.arm
..\src\tx_thread_interrupt_restore.arm
..\src\tx_thread_irq_nesting_end.arm
..\src\tx_thread_irq_nesting_start.arm
..\src\tx_thread_schedule.arm
..\src\tx_thread_stack_build.arm
..\src\tx_thread_system_return.arm
..\src\tx_thread_vectored_context_save.arm
..\src\tx_timer_interrupt.arm
..\..\..\..\common\src\tx_block_allocate.c
..\..\..\..\common\src\tx_block_pool_cleanup.c
..\..\..\..\common\src\tx_block_pool_create.c
..\..\..\..\common\src\tx_block_pool_delete.c
..\..\..\..\common\src\tx_block_pool_info_get.c
..\..\..\..\common\src\tx_block_pool_initialize.c
..\..\..\..\common\src\tx_block_pool_performance_info_get.c
..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c
..\..\..\..\common\src\tx_block_pool_prioritize.c
..\..\..\..\common\src\tx_block_release.c
..\..\..\..\common\src\tx_byte_allocate.c
..\..\..\..\common\src\tx_byte_pool_cleanup.c
..\..\..\..\common\src\tx_byte_pool_create.c
..\..\..\..\common\src\tx_byte_pool_delete.c
..\..\..\..\common\src\tx_byte_pool_info_get.c
..\..\..\..\common\src\tx_byte_pool_initialize.c
..\..\..\..\common\src\tx_byte_pool_performance_info_get.c
..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c
..\..\..\..\common\src\tx_byte_pool_prioritize.c
..\..\..\..\common\src\tx_byte_pool_search.c
..\..\..\..\common\src\tx_byte_release.c
..\..\..\..\common\src\tx_event_flags_cleanup.c
..\..\..\..\common\src\tx_event_flags_create.c
..\..\..\..\common\src\tx_event_flags_delete.c
..\..\..\..\common\src\tx_event_flags_get.c
..\..\..\..\common\src\tx_event_flags_info_get.c
..\..\..\..\common\src\tx_event_flags_initialize.c
..\..\..\..\common\src\tx_event_flags_performance_info_get.c
..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c
..\..\..\..\common\src\tx_event_flags_set.c
..\..\..\..\common\src\tx_event_flags_set_notify.c
..\..\..\..\common\src\tx_initialize_high_level.c
..\..\..\..\common\src\tx_initialize_kernel_enter.c
..\..\..\..\common\src\tx_initialize_kernel_setup.c
..\..\..\..\common\src\tx_mutex_cleanup.c
..\..\..\..\common\src\tx_mutex_create.c
..\..\..\..\common\src\tx_mutex_delete.c
..\..\..\..\common\src\tx_mutex_get.c
..\..\..\..\common\src\tx_mutex_info_get.c
..\..\..\..\common\src\tx_mutex_initialize.c
..\..\..\..\common\src\tx_mutex_performance_info_get.c
..\..\..\..\common\src\tx_mutex_performance_system_info_get.c
..\..\..\..\common\src\tx_mutex_prioritize.c
..\..\..\..\common\src\tx_mutex_priority_change.c
..\..\..\..\common\src\tx_mutex_put.c
..\..\..\..\common\src\tx_queue_cleanup.c
..\..\..\..\common\src\tx_queue_create.c
..\..\..\..\common\src\tx_queue_delete.c
..\..\..\..\common\src\tx_queue_flush.c
..\..\..\..\common\src\tx_queue_front_send.c
..\..\..\..\common\src\tx_queue_info_get.c
..\..\..\..\common\src\tx_queue_initialize.c
..\..\..\..\common\src\tx_queue_performance_info_get.c
..\..\..\..\common\src\tx_queue_performance_system_info_get.c
..\..\..\..\common\src\tx_queue_prioritize.c
..\..\..\..\common\src\tx_queue_receive.c
..\..\..\..\common\src\tx_queue_send.c
..\..\..\..\common\src\tx_queue_send_notify.c
..\..\..\..\common\src\tx_semaphore_ceiling_put.c
..\..\..\..\common\src\tx_semaphore_cleanup.c
..\..\..\..\common\src\tx_semaphore_create.c
..\..\..\..\common\src\tx_semaphore_delete.c
..\..\..\..\common\src\tx_semaphore_get.c
..\..\..\..\common\src\tx_semaphore_info_get.c
..\..\..\..\common\src\tx_semaphore_initialize.c
..\..\..\..\common\src\tx_semaphore_performance_info_get.c
..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c
..\..\..\..\common\src\tx_semaphore_prioritize.c
..\..\..\..\common\src\tx_semaphore_put.c
..\..\..\..\common\src\tx_semaphore_put_notify.c
..\..\..\..\common\src\tx_thread_create.c
..\..\..\..\common\src\tx_thread_delete.c
..\..\..\..\common\src\tx_thread_entry_exit_notify.c
..\..\..\..\common\src\tx_thread_identify.c
..\..\..\..\common\src\tx_thread_info_get.c
..\..\..\..\common\src\tx_thread_initialize.c
..\..\..\..\common\src\tx_thread_performance_info_get.c
..\..\..\..\common\src\tx_thread_performance_system_info_get.c
..\..\..\..\common\src\tx_thread_preemption_change.c
..\..\..\..\common\src\tx_thread_priority_change.c
..\..\..\..\common\src\tx_thread_relinquish.c
..\..\..\..\common\src\tx_thread_reset.c
..\..\..\..\common\src\tx_thread_resume.c
..\..\..\..\common\src\tx_thread_shell_entry.c
..\..\..\..\common\src\tx_thread_sleep.c
..\..\..\..\common\src\tx_thread_stack_analyze.c
..\..\..\..\common\src\tx_thread_stack_error_handler.c
..\..\..\..\common\src\tx_thread_stack_error_notify.c
..\..\..\..\common\src\tx_thread_suspend.c
..\..\..\..\common\src\tx_thread_system_preempt_check.c
..\..\..\..\common\src\tx_thread_system_resume.c
..\..\..\..\common\src\tx_thread_system_suspend.c
..\..\..\..\common\src\tx_thread_terminate.c
..\..\..\..\common\src\tx_thread_time_slice.c
..\..\..\..\common\src\tx_thread_time_slice_change.c
..\..\..\..\common\src\tx_thread_timeout.c
..\..\..\..\common\src\tx_thread_wait_abort.c
..\..\..\..\common\src\tx_time_get.c
..\..\..\..\common\src\tx_time_set.c
..\..\..\..\common\src\tx_timer_activate.c
..\..\..\..\common\src\tx_timer_change.c
..\..\..\..\common\src\tx_timer_create.c
..\..\..\..\common\src\tx_timer_deactivate.c
..\..\..\..\common\src\tx_timer_delete.c
..\..\..\..\common\src\tx_timer_expiration_process.c
..\..\..\..\common\src\tx_timer_info_get.c
..\..\..\..\common\src\tx_timer_initialize.c
..\..\..\..\common\src\tx_timer_performance_info_get.c
..\..\..\..\common\src\tx_timer_performance_system_info_get.c
..\..\..\..\common\src\tx_timer_system_activate.c
..\..\..\..\common\src\tx_timer_system_deactivate.c
..\..\..\..\common\src\tx_timer_thread_entry.c
..\..\..\..\common\src\tx_trace_buffer_full_notify.c
..\..\..\..\common\src\tx_trace_disable.c
..\..\..\..\common\src\tx_trace_enable.c
..\..\..\..\common\src\tx_trace_event_filter.c
..\..\..\..\common\src\tx_trace_event_unfilter.c
..\..\..\..\common\src\tx_trace_initialize.c
..\..\..\..\common\src\tx_trace_interrupt_control.c
..\..\..\..\common\src\tx_trace_isr_enter_insert.c
..\..\..\..\common\src\tx_trace_isr_exit_insert.c
..\..\..\..\common\src\tx_trace_object_register.c
..\..\..\..\common\src\tx_trace_object_unregister.c
..\..\..\..\common\src\tx_trace_user_event_insert.c
..\..\..\..\common\src\txe_block_allocate.c
..\..\..\..\common\src\txe_block_pool_create.c
..\..\..\..\common\src\txe_block_pool_delete.c
..\..\..\..\common\src\txe_block_pool_info_get.c
..\..\..\..\common\src\txe_block_pool_prioritize.c
..\..\..\..\common\src\txe_block_release.c
..\..\..\..\common\src\txe_byte_allocate.c
..\..\..\..\common\src\txe_byte_pool_create.c
..\..\..\..\common\src\txe_byte_pool_delete.c
..\..\..\..\common\src\txe_byte_pool_info_get.c
..\..\..\..\common\src\txe_byte_pool_prioritize.c
..\..\..\..\common\src\txe_byte_release.c
..\..\..\..\common\src\txe_event_flags_create.c
..\..\..\..\common\src\txe_event_flags_delete.c
..\..\..\..\common\src\txe_event_flags_get.c
..\..\..\..\common\src\txe_event_flags_info_get.c
..\..\..\..\common\src\txe_event_flags_set.c
..\..\..\..\common\src\txe_event_flags_set_notify.c
..\..\..\..\common\src\txe_mutex_create.c
..\..\..\..\common\src\txe_mutex_delete.c
..\..\..\..\common\src\txe_mutex_get.c
..\..\..\..\common\src\txe_mutex_info_get.c
..\..\..\..\common\src\txe_mutex_prioritize.c
..\..\..\..\common\src\txe_mutex_put.c
..\..\..\..\common\src\txe_queue_create.c
..\..\..\..\common\src\txe_queue_delete.c
..\..\..\..\common\src\txe_queue_flush.c
..\..\..\..\common\src\txe_queue_front_send.c
..\..\..\..\common\src\txe_queue_info_get.c
..\..\..\..\common\src\txe_queue_prioritize.c
..\..\..\..\common\src\txe_queue_receive.c
..\..\..\..\common\src\txe_queue_send.c
..\..\..\..\common\src\txe_queue_send_notify.c
..\..\..\..\common\src\txe_semaphore_ceiling_put.c
..\..\..\..\common\src\txe_semaphore_create.c
..\..\..\..\common\src\txe_semaphore_delete.c
..\..\..\..\common\src\txe_semaphore_get.c
..\..\..\..\common\src\txe_semaphore_info_get.c
..\..\..\..\common\src\txe_semaphore_prioritize.c
..\..\..\..\common\src\txe_semaphore_put.c
..\..\..\..\common\src\txe_semaphore_put_notify.c
..\..\..\..\common\src\txe_thread_create.c
..\..\..\..\common\src\txe_thread_delete.c
..\..\..\..\common\src\txe_thread_entry_exit_notify.c
..\..\..\..\common\src\txe_thread_info_get.c
..\..\..\..\common\src\txe_thread_preemption_change.c
..\..\..\..\common\src\txe_thread_priority_change.c
..\..\..\..\common\src\txe_thread_relinquish.c
..\..\..\..\common\src\txe_thread_reset.c
..\..\..\..\common\src\txe_thread_resume.c
..\..\..\..\common\src\txe_thread_suspend.c
..\..\..\..\common\src\txe_thread_terminate.c
..\..\..\..\common\src\txe_thread_time_slice_change.c
..\..\..\..\common\src\txe_thread_wait_abort.c
..\..\..\..\common\src\txe_timer_activate.c
..\..\..\..\common\src\txe_timer_change.c
..\..\..\..\common\src\txe_timer_create.c
..\..\..\..\common\src\txe_timer_deactivate.c
..\..\..\..\common\src\txe_timer_delete.c
..\..\..\..\common\src\txe_timer_info_get.c
..\..\..\..\ports_common_green\src\tx_el.c
..\..\..\..\ports_common_green\src\tx_ghs.c
..\..\..\..\ports_common_green\src\tx_ghse.c
..\..\..\..\ports_common_green\src\txr_block_allocate.c
..\..\..\..\ports_common_green\src\txr_block_pool_create.c
..\..\..\..\ports_common_green\src\txr_block_pool_delete.c
..\..\..\..\ports_common_green\src\txr_block_pool_info_get.c
..\..\..\..\ports_common_green\src\txr_block_pool_prioritize.c
..\..\..\..\ports_common_green\src\txr_block_release.c
..\..\..\..\ports_common_green\src\txr_byte_allocate.c
..\..\..\..\ports_common_green\src\txr_byte_pool_create.c
..\..\..\..\ports_common_green\src\txr_byte_pool_delete.c
..\..\..\..\ports_common_green\src\txr_byte_pool_info_get.c
..\..\..\..\ports_common_green\src\txr_byte_pool_prioritize.c
..\..\..\..\ports_common_green\src\txr_byte_release.c
..\..\..\..\ports_common_green\src\txr_event_flags_create.c
..\..\..\..\ports_common_green\src\txr_event_flags_delete.c
..\..\..\..\ports_common_green\src\txr_event_flags_get.c
..\..\..\..\ports_common_green\src\txr_event_flags_info_get.c
..\..\..\..\ports_common_green\src\txr_event_flags_set.c
..\..\..\..\ports_common_green\src\txr_event_flags_set_notify.c
..\..\..\..\ports_common_green\src\txr_ghs.c
..\..\..\..\ports_common_green\src\txr_mutex_create.c
..\..\..\..\ports_common_green\src\txr_mutex_delete.c
..\..\..\..\ports_common_green\src\txr_mutex_get.c
..\..\..\..\ports_common_green\src\txr_mutex_info_get.c
..\..\..\..\ports_common_green\src\txr_mutex_prioritize.c
..\..\..\..\ports_common_green\src\txr_mutex_put.c
..\..\..\..\ports_common_green\src\txr_queue_create.c
..\..\..\..\ports_common_green\src\txr_queue_delete.c
..\..\..\..\ports_common_green\src\txr_queue_flush.c
..\..\..\..\ports_common_green\src\txr_queue_front_send.c
..\..\..\..\ports_common_green\src\txr_queue_info_get.c
..\..\..\..\ports_common_green\src\txr_queue_prioritize.c
..\..\..\..\ports_common_green\src\txr_queue_receive.c
..\..\..\..\ports_common_green\src\txr_queue_send.c
..\..\..\..\ports_common_green\src\txr_queue_send_notify.c
..\..\..\..\ports_common_green\src\txr_semaphore_ceiling_put.c
..\..\..\..\ports_common_green\src\txr_semaphore_create.c
..\..\..\..\ports_common_green\src\txr_semaphore_delete.c
..\..\..\..\ports_common_green\src\txr_semaphore_get.c
..\..\..\..\ports_common_green\src\txr_semaphore_info_get.c
..\..\..\..\ports_common_green\src\txr_semaphore_prioritize.c
..\..\..\..\ports_common_green\src\txr_semaphore_put.c
..\..\..\..\ports_common_green\src\txr_semaphore_put_notify.c
..\..\..\..\ports_common_green\src\txr_thread_create.c
..\..\..\..\ports_common_green\src\txr_thread_delete.c
..\..\..\..\ports_common_green\src\txr_thread_entry_exit_notify.c
..\..\..\..\ports_common_green\src\txr_thread_info_get.c
..\..\..\..\ports_common_green\src\txr_thread_preemption_change.c
..\..\..\..\ports_common_green\src\txr_thread_priority_change.c
..\..\..\..\ports_common_green\src\txr_thread_reset.c
..\..\..\..\ports_common_green\src\txr_thread_resume.c
..\..\..\..\ports_common_green\src\txr_thread_suspend.c
..\..\..\..\ports_common_green\src\txr_thread_terminate.c
..\..\..\..\ports_common_green\src\txr_thread_time_slice_change.c
..\..\..\..\ports_common_green\src\txr_thread_wait_abort.c
..\..\..\..\ports_common_green\src\txr_timer_activate.c
..\..\..\..\ports_common_green\src\txr_timer_change.c
..\..\..\..\ports_common_green\src\txr_timer_create.c
..\..\..\..\ports_common_green\src\txr_timer_deactivate.c
..\..\..\..\ports_common_green\src\txr_timer_delete.c
..\..\..\..\ports_common_green\src\txr_timer_info_get.c

View File

@@ -0,0 +1,402 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Port Specific */
/** */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/* */
/* PORT SPECIFIC C INFORMATION RELEASE */
/* */
/* tx_port.h Cortex-A9/Green Hills */
/* 6.1 */
/* */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This file contains data type definitions that make the ThreadX */
/* real-time kernel function identically on a variety of different */
/* processor architectures. For example, the size or number of bits */
/* in an "int" data type vary between microprocessor architectures and */
/* even C compilers for the same microprocessor. ThreadX does not */
/* directly use native C data types. Instead, ThreadX creates its */
/* own special types that can be mapped to actual data types by this */
/* file to guarantee consistency in the interface and functionality. */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
#ifndef TX_PORT_H
#define TX_PORT_H
/* Determine if the optional ThreadX user define file should be used. */
#ifdef TX_INCLUDE_USER_DEFINE_FILE
/* Yes, include the user defines in tx_user.h. The defines in this file may
alternately be defined on the command line. */
#include "tx_user.h"
#endif
/* Define compiler library include files. */
#include <stdlib.h>
#include <string.h>
#include <arm_ghs.h>
#include "tx_ghs.h"
/* Define ThreadX basic types for this port. */
#define VOID void
typedef char CHAR;
typedef unsigned char UCHAR;
typedef int INT;
typedef unsigned int UINT;
typedef long LONG;
typedef unsigned long ULONG;
typedef short SHORT;
typedef unsigned short USHORT;
/* Define the priority levels for ThreadX. Legal values range
from 32 to 1024 and MUST be evenly divisible by 32. */
#ifndef TX_MAX_PRIORITIES
#define TX_MAX_PRIORITIES 32
#endif
/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during
thread creation is less than this value, the thread create call will return an error. */
#ifndef TX_MINIMUM_STACK
#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */
#endif
/* Define the system timer thread's default stack size and priority. These are only applicable
if TX_TIMER_PROCESS_IN_ISR is not defined. */
#ifndef TX_TIMER_THREAD_STACK_SIZE
#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */
#endif
#ifndef TX_TIMER_THREAD_PRIORITY
#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */
#endif
/* Define various constants for the ThreadX ARM port. */
#ifdef TX_ENABLE_FIQ_SUPPORT
#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */
#else
#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */
#endif
#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */
/* Define constants for Green Hills EventAnalyzer. */
/* Define the number of ticks per second. This informs the EventAnalyzer what the timestamps
represent. By default, this is set to 1,000,000 i.e., one tick every microsecond. */
#define TX_EL_TICKS_PER_SECOND 1000000
/* Define the method of how to get the upper and lower 32-bits of the time stamp. By default, simply
simulate the time-stamp source with a counter. */
#define read_tbu() _tx_el_time_base_upper
#define read_tbl() ++_tx_el_time_base_lower
/* Define the port specific options for the _tx_build_options variable. This variable indicates
how the ThreadX library was built. */
#ifdef TX_ENABLE_FIQ_SUPPORT
#define TX_FIQ_ENABLED 1
#else
#define TX_FIQ_ENABLED 0
#endif
#ifdef TX_ENABLE_IRQ_NESTING
#define TX_IRQ_NESTING_ENABLED 2
#else
#define TX_IRQ_NESTING_ENABLED 0
#endif
#ifdef TX_ENABLE_FIQ_NESTING
#define TX_FIQ_NESTING_ENABLED 4
#else
#define TX_FIQ_NESTING_ENABLED 0
#endif
#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED)
/* Define the in-line initialization constant so that modules with in-line
initialization capabilities can prevent their initialization from being
a function call. */
#define TX_INLINE_INITIALIZATION
/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is
disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack
checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING
define is negated, thereby forcing the stack fill which is necessary for the stack checking
logic. */
#ifdef TX_ENABLE_STACK_CHECKING
#undef TX_DISABLE_STACK_FILLING
#endif
/* Define the TX_THREAD control block extensions for this port. The main reason
for the multiple macros is so that backward compatibility can be maintained with
existing ThreadX kernel awareness modules. */
#define TX_THREAD_EXTENSION_0
#define TX_THREAD_EXTENSION_1
#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \
VOID * tx_thread_eh_globals; \
int Errno; /* errno. */ \
char * strtok_saved_pos; /* strtok() position. */
#define TX_THREAD_EXTENSION_3
/* Define the port extensions of the remaining ThreadX objects. */
#define TX_BLOCK_POOL_EXTENSION
#define TX_BYTE_POOL_EXTENSION
#define TX_EVENT_FLAGS_GROUP_EXTENSION
#define TX_MUTEX_EXTENSION
#define TX_QUEUE_EXTENSION
#define TX_SEMAPHORE_EXTENSION
#define TX_TIMER_EXTENSION
/* Define the user extension field of the thread control block. Nothing
additional is needed for this port so it is defined as white space. */
#ifndef TX_THREAD_USER_EXTENSION
#define TX_THREAD_USER_EXTENSION
#endif
/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete,
tx_thread_shell_entry, and tx_thread_terminate. */
#if (__GHS_VERSION_NUMBER >= 500)
#define TX_THREAD_CREATE_EXTENSION(thread_ptr) \
{ \
extern void __tx_cpp_exception_init(TX_THREAD *thread_ptr); \
__tx_cpp_exception_init(thread_ptr); \
}
#else
#define TX_THREAD_CREATE_EXTENSION(thread_ptr) \
{ \
#pragma weak __cpp_exception_init \
extern void __cpp_exception_init(void **); \
static void (*const cpp_init_funcp)(void **) = __cpp_exception_init; \
if (cpp_init_funcp) \
__cpp_exception_init(&(thread_ptr -> tx_thread_eh_globals)); \
}
#endif
#if (__GHS_VERSION_NUMBER >= 500)
#define TX_THREAD_DELETE_EXTENSION(thread_ptr) \
{ \
extern void __tx_cpp_exception_cleanup(TX_THREAD *thread_ptr); \
__tx_cpp_exception_cleanup(thread_ptr); \
}
#else
#define TX_THREAD_DELETE_EXTENSION(thread_ptr) \
{ \
#pragma weak __cpp_exception_cleanup \
extern void __cpp_exception_cleanup(void **); \
static void (*const cpp_cleanup_funcp)(void **) = \
__cpp_exception_cleanup; \
if (cpp_cleanup_funcp) \
__cpp_exception_cleanup(&(thread_ptr -> tx_thread_eh_globals)); \
}
#endif
#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr)
#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr)
/* Define the ThreadX object creation extensions for the remaining objects. */
#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr)
#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr)
#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr)
#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr)
#define TX_QUEUE_CREATE_EXTENSION(queue_ptr)
#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr)
#define TX_TIMER_CREATE_EXTENSION(timer_ptr)
/* Define the ThreadX object deletion extensions for the remaining objects. */
#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr)
#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr)
#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr)
#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr)
#define TX_QUEUE_DELETE_EXTENSION(queue_ptr)
#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr)
#define TX_TIMER_DELETE_EXTENSION(timer_ptr)
/* Determine if the ARM architecture has the CLZ instruction. This is available on
architectures v5 and above. If available, redefine the macro for calculating the
lowest bit set. */
#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \
b = __CLZ32(m); \
b = 31 - b;
/* Define ThreadX interrupt lockout and restore macros for protection on
access of critical kernel information. The restore interrupt macro must
restore the interrupt posture of the running thread prior to the value
present prior to the disable macro. In most cases, the save area macro
is used to define a local function save area for the disable and restore
macros. */
#if defined(__THUMB)
unsigned int _tx_thread_interrupt_disable(void);
void _tx_thread_interrupt_restore(unsigned int new_posture);
#define TX_INTERRUPT_SAVE_AREA register int interrupt_save;
#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable();
#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save);
#else
#define TX_INTERRUPT_SAVE_AREA register int interrupt_save;
#if defined(__GHS_VERSION_NUMBER) && (__GHS_VERSION_NUMBER >= 350)
/* Define ThreadX interrupt lockout and restore macros using
compiler built-in functions if using Green Hills ARM compiler
version 3.5 or later. */
#ifdef TX_ENABLE_FIQ_SUPPORT
#define TX_DISABLE interrupt_save = __GETSR(); \
__SETSR(interrupt_save | 0xC0);
#define TX_RESTORE __SETSR(interrupt_save);
#else
#define TX_DISABLE interrupt_save = __GETSR(); \
__SETSR(interrupt_save | 0x80);
#define TX_RESTORE __SETSR(interrupt_save);
#endif
#else
/* Define ThreadX interrupt lockout and restore macros using
asm macros if using Green Hills ARM compiler earlier than
version 3.5. */
asm int disable_ints(void)
{
%
MRS r0,CPSR
#ifdef TX_BEFORE_ARMV6
#ifdef TX_ENABLE_FIQ_SUPPORT
ORR r1,r0,0xC0
#else
ORR r1,r0,0x80
#endif
MSR CPSR_c,r1
#else
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSID if
#else
CPSID i
#endif
#endif
%error
}
asm void restore_ints(int a)
{
%reg a
MSR CPSR_c,a
%mem a
LDR r0,a
MSR CPSR_c,r0
%error
}
#define TX_DISABLE interrupt_save = disable_ints();
#define TX_RESTORE restore_ints(interrupt_save);
#endif
#endif
/* Define VFP extension for the Cortex-A8. Each is assumed to be called in the context of the executing
thread. */
void tx_thread_vfp_enable(void);
void tx_thread_vfp_disable(void);
/* Define the interrupt lockout macros for each ThreadX object. */
#define TX_BLOCK_POOL_DISABLE TX_DISABLE
#define TX_BYTE_POOL_DISABLE TX_DISABLE
#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE
#define TX_MUTEX_DISABLE TX_DISABLE
#define TX_QUEUE_DISABLE TX_DISABLE
#define TX_SEMAPHORE_DISABLE TX_DISABLE
/* Define the version ID of ThreadX. This may be utilized by the application. */
#ifdef TX_THREAD_INIT
CHAR _tx_version_id[] =
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/Green Hills Version 6.1 *";
#else
extern CHAR _tx_version_id[];
#endif
#endif

View File

@@ -0,0 +1,527 @@
Microsoft's Azure RTOS ThreadX for Cortex-A9
Using the Green Hills Software Tools
1. Open the ThreadX Project Workspace
In order to build the ThreadX library and the ThreadX demonstration first load
the Azure RTOS Workspace azure_rtos_workspace.gpj, which is located inside the
"example_build" directory.
2. Building the ThreadX run-time Library
Building the ThreadX library is easy; simply select the MULTI project file
tx.gpj and then select the build button. You should now observe the
compilation and assembly of the ThreadX library. This project build produces
the ThreadX library file tx.a.
3. Demonstration System
The ThreadX demonstration is designed to execute under the MULTI environment
on the Green Hills Cortex-A9 simulator. The instructions that follow describe
how to get the ThreadX evaluation running under the MULTI Cortex-A9 simulation
environment.
Building the demonstration is easy; simply select the MULTI project file
sample_threadx.gpj. At this point, select the "Project Build" button and observe
the compilation, assembly, and linkage of the ThreadX demonstration application.
After the demonstration is built, invoke the MULTI ARM simulator by selecting
the simulator connection from within the sample_threadx.con connection file.
Once connected to the simulator, select the "Debug" button. You should now
observe the main function of sample_threadx.c.
At this point, you should setup a simulated timer interrupt for ThreadX
by entering "timer 9999 irq" in the "target" window of the debugger.
You are now ready to execute the ThreadX demonstration system. Select
breakpoints and data watches to observe the execution of the sample_threadx.c
application.
4. EventAnalyzer Demonstration
To build a demonstration system that also logs events for the MULTI EventAnalyzer,
perform the same steps as the regular demo, except build the ThreadX library with
txe.gpj file and use the sample_threadx_el.gpj build file to build the demonstration.
The resulting image will log all system events, which can then be displayed by the
MULTI EventAnalyzer.
5. System Initialization
The system entry point using the Green Hills tools is at the label _start.
This is defined within the crt0.arm file supplied by Green Hills. In addition,
this is where all static and global preset C variable initialization
processing is called from.
After the Green Hills startup function returns, ThreadX initialization is
called. The main initialization function is _tx_initialize_low_level and
is located in the file tx_initialize_low_level.arm. This function is responsible
for setting up various system data structures, interrupt vectors, and the
periodic timer interrupt source of ThreadX.
In addition, _tx_initialize_low_level determines where the first available
RAM memory address is located. This address is supplied to tx_application_define.
By default, the first available RAM memory address is assumed to start at the
beginning of the ThreadX section .free_mem. If changes are made to the
sample_threadx.ld file, the .free_mem section should remain the last allocated
section in the main RAM area. The starting address of this section is passed
to tx_application_define.
6. User defines
The following defines and their associated action are as follows:
Define Meaning
TX_ENABLE_IRQ_NESTING If defined, this brings in special IRQ
interrupt nesting logic into the ThreadX
library. This define should be applied
to the entire ThreadX library.
TX_ENABLE_FIQ_NESTING If defined, this brings in special FIQ
interrupt nesting logic into the ThreadX
library. This define should be applied
to the entire ThreadX library and the
define TX_ENABLE_FIQ_SUPPORT should also
be defined.
TX_ENABLE_FIQ_SUPPORT If defined, this brings in FIQ context
save and restore logic necessary for
applications to call ThreadX services from
FIQ interrupt handlers. This define
should be applied to the entire ThreadX
library.
TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included,
this define causes basic ThreadX error
checking to be disabled. Please see
Chapter 4 in the "ThreadX User Guide"
for more details.
TX_ENABLE_EVENT_LOGGING This define enables event logging for any
or all of the ThreadX source code. If this
option is used anywhere, the tx_initialize_high_level.c
file must be compiled with it as well, since this
is where the event log is initialized.
TX_NO_EVENT_INFO This is a sub-option for event logging.
If this is enabled, only basic information
is saved in the log.
TX_ENABLE_EVENT_FILTERS This is also a sub-option for event-logging.
If this is enabled, run-time filtering logic
is added to the event logging code.
TX_MAX_PRIORITIES Defines the priority levels for ThreadX.
Legal values range from 32 through
1024 (inclusive) and MUST be evenly divisible
by 32. Increasing the number of priority levels
supported increases the RAM usage by 128 bytes
for every group of 32 priorities. However, there
is only a negligible effect on performance. By
default, this value is set to 32 priority levels.
TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is
used for error checking when threads are created.
The default value is port-specific and is found
in tx_port.h.
TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal
ThreadX timer thread. This thread processes all
thread sleep requests as well as all service call
timeouts. In addition, all application timer callback
routines are invoked from this context. The default
value is port-specific and is found in tx_port.h.
TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer
thread. The default value is priority 0 - the highest
priority in ThreadX. The default value is defined
in tx_port.h.
TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system
timer thread for ThreadX. This results in improved
performance on timer events and smaller RAM requirements
because the timer stack and control block are no
longer needed. However, using this option moves all
the timer expiration processing to the timer ISR level.
By default, this option is not defined.
TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX
timers in-line instead of using a function call. This
improves performance but slightly increases code size.
By default, this option is not defined.
TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each
thread's stack is disabled. By default, this option is
not defined.
TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking,
which includes analysis of how much stack has been used and
examination of data pattern "fences" before and after the
stack area. If a stack error is detected, the registered
application stack error handler is called. This option does
result in slightly increased overhead and code size. Please
review the tx_thread_stack_error_notify API for more information.
By default, this option is not defined.
TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature
and slightly reduces code size and improves performance. Of course,
the preemption-threshold capabilities are no longer available.
By default, this option is not defined.
TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX
global C data structures to zero. This should only be used if
the compiler's initialization code sets all un-initialized
C global data to zero. Using this option slightly reduces
code size and improves performance during initialization.
By default, this option is not defined.
TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various
ThreadX objects. Using this option slightly reduces code size
and improves performance.
TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance
information on block pools. By default, this option is
not defined.
TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance
information on byte pools. By default, this option is
not defined.
TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance
information on event flags groups. By default, this option
is not defined.
TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance
information on mutexes. By default, this option is
not defined.
TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance
information on queues. By default, this option is
not defined.
TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance
information on semaphores. By default, this option is
not defined.
TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance
information on threads. By default, this option is
not defined.
TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance
information on timers. By default, this option is
not defined.
7. Register Usage and Stack Frames
The Green Hills compiler assumes that registers r0-r3 (a1-a4) and r12 (ip)
are scratch registers for each function. All other registers used by a C
function must be preserved by the function. ThreadX takes advantage of this
in situations where a context switch happens as a result of making a ThreadX
service call (which is itself a C function). In such cases, the saved
context of a thread is only the non-scratch registers.
The following defines the saved context stack frames for context switches
that occur as a result of interrupt handling or from thread-level API calls.
All suspended threads have one of these two types of stack frames. The top
of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the
associated thread control block TX_THREAD.
Offset Interrupted Stack Frame Non-Interrupt Stack Frame
0x00 1 0
0x04 CPSR CPSR
0x08 r0 (a1) r4 (v1)
0x0C r1 (a2) r5 (v2)
0x10 r2 (a3) r6 (v3)
0x14 r3 (a4) r7 (v4)
0x18 r4 (v1) r8 (v5)
0x1C r5 (v2) r9 (v6)
0x20 r6 (v3) r10 (v7)
0x24 r7 (v4) r11 (fp)
0x28 r8 (v5) r14 (lr)
0x2C r9 (v6)
0x30 r10 (v7)
0x34 r11 (fp)
0x38 r12 (ip)
0x3C r14 (lr)
0x40 PC
8. Improving Performance
The distribution version of ThreadX is built without any compiler
optimizations. This makes it easy to debug because you can trace or set
breakpoints inside of ThreadX itself. Of course, this costs some
performance. To make ThreadX run faster, you can change the tx.gpj project
to disable debug information and enable the desired optimizations.
In addition, you can eliminate the ThreadX basic API error checking by
compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING
defined before tx_api.h is included.
9. Interrupt Handling
ThreadX provides complete and high-performance interrupt handling for Cortex-A9
targets. There are a certain set of requirements that are defined in the
following sub-sections:
9.1 Vector Area
The Cortex-A9 vectors start at address zero. The demonstration system reset.arm
file contains the reset section (which contains all the ARM vectors) and is
typically loaded at address zero. On actual hardware platforms, this section
might have to be copied to address 0.
9.2 IRQ ISRs
ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested
IRQ interrupts. The following sub-sections define the IRQ capabilities.
9.2.1 Standard IRQ ISRs
The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ
interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following
is the default IRQ handler defined in tx_initialize_low_level.arm:
.globl __tx_irq_handler
.globl __tx_irq_processing_return
__tx_irq_handler:
/* Jump to context save to save system context. */
B _tx_thread_context_save
__tx_irq_processing_return:
/* At this point execution is still in the IRQ mode. The CPSR, point of
interrupt, and all C scratch registers are available for use. Note
that IRQ interrupts are still disabled upon return from the context
save function. */
/* Application ISR call(s) go here! */
/* Jump to context restore to restore system context. */
B _tx_thread_context_restore
9.2.2 Vectored IRQ ISRs
The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified
by the particular implementation. The following is an example IRQ handler defined in
tx_initialize_low_level.arm:
.globl __tx_irq_example_handler
__tx_irq_example_handler:
/* Call context save to save system context. */
STMDB sp!, {r0-r3} # Save some scratch registers
MRS r0, SPSR # Pickup saved SPSR
SUB lr, lr, #4 # Adjust point of interrupt
STMDB sp!, {r0, r10, r12, lr} # Store other scratch registers
BL _tx_thread_vectored_context_save # Call the vectored IRQ context save
/* At this point execution is still in the IRQ mode. The CPSR, point of
interrupt, and all C scratch registers are available for use. Note
that IRQ interrupts are still disabled upon return from the context
save function. */
/* Application ISR call goes here! */
/* Jump to context restore to restore system context. */
B _tx_thread_context_restore
9.2.3 Nested IRQ Support
By default, nested IRQ interrupt support is not enabled. To enable nested
IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING
defined. With this defined, two new IRQ interrupt management services are
available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end.
These function should be called between the IRQ context save and restore
calls.
Execution between the calls to _tx_thread_irq_nesting_start and
_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved
by switching from IRQ mode to SYS mode and enabling IRQ interrupts.
The SYS mode stack is used during the SYS mode operation, which was
setup in tx_initialize_low_level.arm. When nested IRQ interrupts are no
longer required, calling the _tx_thread_irq_nesting_end service disables nesting
by disabling IRQ interrupts and switching back to IRQ mode in preparation for
the IRQ context restore service.
The following is an example of enabling IRQ nested interrupts in the
typical IRQ handler:
.globl __tx_irq_handler
.globl __tx_irq_processing_return
__tx_irq_handler:
/* Jump to context save to save system context. */
B _tx_thread_context_save
__tx_irq_processing_return:
/* Enable nested IRQ interrupts. NOTE: Since this service returns
with IRQ interrupts enabled, all IRQ interrupt sources must be
cleared prior to calling this service. */
BL _tx_thread_irq_nesting_start
/* Application ISR call(s) go here! */
/* Disable nested IRQ interrupts. The mode is switched back to
IRQ mode and IRQ interrupts are disable upon return. */
BL _tx_thread_irq_nesting_end
/* Jump to context restore to restore system context. */
B _tx_thread_context_restore
9.3 FIQ Interrupts
By default, Cortex-A9 FIQ interrupts are left completely enabled by ThreadX.
Of course, this means that the application is fully responsible for
saving/restoring any registers used in the FIQ ISR processing. In addition,
no ThreadX service calls are allowed from the default FIQ ISRs. The default
FIQ interrupt shell is located in tx_initialize_low_level.arm.
9.3.1 Managed FIQ Interrupts
Full ThreadX management of FIQ interrupts is provided if the ThreadX sources
are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built
this way, the FIQ interrupt handlers are very similar to the IRQ interrupt
handlers defined previously. The following is default FIQ handler
defined in tx_initialize_low_level.arm:
.globl __tx_fiq_handler
.globl __tx_fiq_processing_return
__tx_fiq_handler:
/* Jump to fiq context save to save system context. */
B _tx_thread_fiq_context_save
__tx_fiq_processing_return:
/* At this point execution is still in the FIQ mode. The CPSR, point of
interrupt, and all C scratch registers are available for use. */
/* Application FIQ handlers can be called here! */
/* Jump to fiq context restore to restore system context. */
B _tx_thread_fiq_context_restore
9.3.1.1 Nested FIQ Support
By default, nested FIQ interrupt support is not enabled. To enable nested
FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING
defined. With this defined, two new FIQ interrupt management services are
available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end.
These function should be called between the FIQ context save and restore
calls.
Execution between the calls to _tx_thread_fiq_nesting_start and
_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved
by switching from FIQ mode to SYS mode and enabling FIQ interrupts.
The SYS mode stack is used during the SYS mode operation, which was
setup in tx_initialize_low_level.arm. When nested FIQ interrupts are no longer
required, calling the _tx_thread_fiq_nesting_end service disables nesting by
disabling FIQ interrupts and switching back to FIQ mode in preparation for the FIQ
context restore service.
The following is an example of enabling FIQ nested interrupts in the
typical FIQ handler:
.globl __tx_fiq_handler
.globl __tx_fiq_processing_return
__tx_fiq_handler:
/* Jump to fiq context save to save system context. */
B _tx_thread_fiq_context_save
__tx_fiq_processing_return:
/* At this point execution is still in the FIQ mode. The CPSR, point of
interrupt, and all C scratch registers are available for use. */
/* Enable nested FIQ interrupts. NOTE: Since this service returns
with FIQ interrupts enabled, all FIQ interrupt sources must be
cleared prior to calling this service. */
BL _tx_thread_fiq_nesting_start
/* Application FIQ handlers can be called here! */
/* Disable nested FIQ interrupts. The mode is switched back to
FIQ mode and FIQ interrupts are disable upon return. */
BL _tx_thread_fiq_nesting_end
/* Jump to fiq context restore to restore system context. */
B _tx_thread_fiq_context_restore
10. ThreadX Timer Interrupt
ThreadX requires a periodic interrupt source to manage all time-slicing,
thread sleeps, timeouts, and application timers. Without such a timer
interrupt source, these services are not functional. However, all other
ThreadX services are operational without a periodic timer source.
To add the timer interrupt processing, simply make a call to
_tx_timer_interrupt in the IRQ processing. An example of this can be
found in the file tx_initialize_low_level.arm.
11. Thumb/Cortex-A9 Mixed Mode
By default, ThreadX is setup for running in Cortex-A9 32-bit mode. This is
also true for the demonstration system. It is possible to build any
ThreadX file and/or the application in Thumb mode. The only exception
to this is the file tx_thread_shell_entry.c. This file must always be
built in 32-bit mode.
12. VFP Support
By default, VFP support is disabled for each thread. If saving the context of the VFP registers
is needed, the following API call must be made from the context of the application thread - before
the VFP usage:
void tx_thread_vfp_enable(void);
After this API is called in the application, VFP registers will be saved/restored for this thread if it
is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers
to be saved/restored.
To disable VFP register context saving, simply call the following API:
void tx_thread_vfp_disable(void);
13. Revision History
For generic code revision information, please refer to the readme_threadx_generic.txt
file, which is included in your distribution. The following details the revision
information associated with this specific port of ThreadX:
05/19/2020 Initial ThreadX version of Cortex-A9/Green Hills port.
Copyright(c) 1996-2020 Microsoft Corporation
https://azure.com/rtos

View File

@@ -0,0 +1,259 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
DISABLE_INTS = 0xC0 # Disable IRQ and FIQ interrupts
#else
DISABLE_INTS = 0x80 # Disable IRQ interrupts
#endif
SVC_MODE = (0x13 | DISABLE_INTS) # SVC mode
IRQ_MODE = (0x12 | DISABLE_INTS) # IRQ mode
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_context_restore Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function restores the interrupt context if it is processing a */
/* nested interrupt. If not, it returns to the interrupt thread if no */
/* preemption is necessary. Otherwise, if preemption is necessary or */
/* if no thread was running, the function returns to the scheduler. */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _tx_thread_schedule Thread scheduling routine */
/* */
/* CALLED BY */
/* */
/* ISRs Interrupt Service Routines */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
/* VOID _tx_thread_context_restore(VOID)
{ */
.globl _tx_thread_context_restore
_tx_thread_context_restore:
/* Lockout interrupts. */
#ifdef TX_BEFORE_ARMV6
MRS r3, CPSR # Pickup current CPSR
ORR r0, r3, DISABLE_INTS # Build interrupt disable value
MSR CPSR_c, r0 # Lockout interrupts
#else
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSID if # Disable IRQ and FIQ interrupts
#else
CPSID i # Disable IRQ interrupts
#endif
#endif
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR exit function to indicate an ISR is complete. */
BL _tx_execution_isr_exit # Call the ISR exit function
#endif
/* Determine if interrupts are nested. */
/* if (--_tx_thread_system_state)
{ */
LDR r3, =_tx_thread_system_state # Pickup address of system state var
LDR r2, [r3] # Pickup system state
SUB r2, r2, 1 # Decrement the counter
STR r2, [r3] # Store the counter
CMP r2, 0 # Was this the first interrupt?
BEQ __tx_thread_not_nested_restore # If so, not a nested restore
/* Interrupts are nested. */
/* Just recover the saved registers and return to the point of
interrupt. */
LDMIA sp!, {r0, r10, r12, lr} # Recover SPSR, POI, and scratch regs
MSR SPSR_cxsf, r0 # Put SPSR back
LDMIA sp!, {r0-r3} # Recover r0-r3
MOVS pc, lr # Return to point of interrupt
/* } */
__tx_thread_not_nested_restore:
/* Determine if a thread was interrupted and no preemption is required. */
/* else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr)
|| (_tx_thread_preempt_disable))
{ */
LDR r1, =_tx_thread_current_ptr # Pickup address of current thread ptr
LDR r0, [r1] # Pickup actual current thread pointer
CMP r0, 0 # Is it NULL?
BEQ __tx_thread_idle_system_restore # Yes, idle system was interrupted
LDR r3, =_tx_thread_preempt_disable # Pickup preempt disable address
LDR r2, [r3] # Pickup actual preempt disable flag
CMP r2, 0 # Is it set?
BNE __tx_thread_no_preempt_restore # Yes, don't preempt this thread
LDR r3, =_tx_thread_execute_ptr # Pickup address of execute thread ptr
LDR r2, [r3] # Pickup actual execute thread pointer
CMP r0, r2 # Is the same thread highest priority?
BNE __tx_thread_preempt_restore # No, preemption needs to happen
__tx_thread_no_preempt_restore:
/* Restore interrupted thread or ISR. */
/* Pickup the saved stack pointer. */
/* tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; */
/* Recover the saved context and return to the point of interrupt. */
LDMIA sp!, {r0, r10, r12, lr} # Recover SPSR, POI, and scratch regs
MSR SPSR_cxsf, r0 # Put SPSR back
LDMIA sp!, {r0-r3} # Recover r0-r3
MOVS pc, lr # Return to point of interrupt
/* }
else
{ */
__tx_thread_preempt_restore:
LDMIA sp!, {r3, r10, r12, lr} # Recover temporarily saved registers
MOV r1, lr # Save lr (point of interrupt)
MOV r2, SVC_MODE # Build SVC mode CPSR
MSR CPSR_c, r2 # Enter SVC mode
STR r1, [sp, -4]! # Save point of interrupt
STMDB sp!, {r4-r12, lr} # Save upper half of registers
MOV r4, r3 # Save SPSR in r4
MOV r2, IRQ_MODE # Build IRQ mode CPSR
MSR CPSR_c, r2 # Re-enter IRQ mode
LDMIA sp!, {r0-r3} # Recover r0-r3
MOV r5, SVC_MODE # Build SVC mode CPSR
MSR CPSR_c, r5 # Enter SVC mode
STMDB sp!, {r0-r3} # Save r0-r3 on thread's stack
LDR r1, =_tx_thread_current_ptr # Pickup address of current thread ptr
LDR r0, [r1] # Pickup current thread pointer
#ifdef __VFP__
LDR r2, [r0, 144] # Pickup the VFP enabled flag
CMP r2, 0 # Is the VFP enabled?
BEQ _tx_skip_irq_vfp_save # No, skip VFP IRQ save
VMRS r2, FPSCR # Pickup the FPSCR
STR r2, [sp, -4]! # Save FPSCR
VSTMDB sp!, {D16-D31} # Save D16-D31
VSTMDB sp!, {D0-D15} # Save D0-D15
_tx_skip_irq_vfp_save:
#endif
MOV r3, 1 # Build interrupt stack type
STMDB sp!, {r3, r4} # Save interrupt stack type and SPSR
STR sp, [r0, 8] # Save stack pointer in thread control
/* # block */
#ifdef TX_ENABLE_EVENT_LOGGING
MOV r4, r0 # Save r0
MOV r5, r1 # Save r1
BL _tx_el_thread_preempted # Call thread preempted routine
MOV r0, r4 # Restore r0
MOV r1, r5 # Restore r1
#endif
/* Save the remaining time-slice and disable it. */
/* if (_tx_timer_time_slice)
{ */
LDR r3, =_tx_timer_time_slice # Pickup time-slice variable address
LDR r2, [r3] # Pickup time-slice
CMP r2, 0 # Is it active?
BEQ __tx_thread_dont_save_ts # No, don't save it
/* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice;
_tx_timer_time_slice = 0; */
STR r2, [r0, 24] # Save thread's time-slice
MOV r2, 0 # Clear value
STR r2, [r3] # Disable global time-slice flag
/* } */
__tx_thread_dont_save_ts:
/* Clear the current task pointer. */
/* _tx_thread_current_ptr = TX_NULL; */
MOV r0, 0 # NULL value
STR r0, [r1] # Clear current thread pointer
/* Return to the scheduler. */
/* _tx_thread_schedule(); */
B _tx_thread_schedule # Return to scheduler
/* } */
__tx_thread_idle_system_restore:
/* Just return back to the scheduler! */
MOV r3, SVC_MODE # Build SVC mode CPSR
MSR CPSR_c, r3 # Lockout interrupts
B _tx_thread_schedule # Return to scheduler
.type _tx_thread_context_restore,$function
.size _tx_thread_context_restore,.-_tx_thread_context_restore
/* } */

View File

@@ -0,0 +1,207 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
DISABLE_INTS = 0xC0 # IRQ & FIQ interrupts disabled
#else
DISABLE_INTS = 0x80 # IRQ interrupts disabled
#endif
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_context_save Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function saves the context of an executing thread in the */
/* beginning of interrupt processing. The function also ensures that */
/* the system stack is used upon return to the calling ISR. */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* ISRs */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
/* VOID _tx_thread_context_save(VOID)
{ */
.globl _tx_thread_context_save
_tx_thread_context_save:
/* Upon entry to this routine, it is assumed that IRQ interrupts are locked
out, we are in IRQ mode, and all registers are intact. */
/* Check for a nested interrupt condition. */
/* if (_tx_thread_system_state++)
{ */
STMDB sp!, {r0-r3} # Save some working registers
#ifdef TX_ENABLE_FIQ_SUPPORT
#ifdef TX_BEFORE_ARMV6
MRS r0, CPSR # Pickup the CPSR
ORR r0, r0, DISABLE_INTS # Build disable interrupt CPSR
MSR CPSR_c, r0 # Disable interrupts
#else
CPSID if # Disable FIQ interrupts
#endif
#endif
LDR r3, =_tx_thread_system_state # Pickup address of system state var
LDR r2, [r3] # Pickup system state
CMP r2, 0 # Is this the first interrupt?
BEQ __tx_thread_not_nested_save # Yes, not a nested context save
/* Nested interrupt condition. */
ADD r2, r2, 1 # Increment the interrupt counter
STR r2, [r3] # Store it back in the variable
/* Save the rest of the scratch registers on the stack and return to the
calling ISR. */
MRS r0, SPSR # Pickup saved SPSR
SUB lr, lr, 4 # Adjust point of interrupt
STMDB sp!, {r0, r10, r12, lr} # Store other registers
/* Return to the ISR. */
MOV r10, 0 # Clear stack limit
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
B __tx_irq_processing_return # Continue IRQ processing
__tx_thread_not_nested_save:
/* } */
/* Otherwise, not nested, check to see if a thread was running. */
/* else if (_tx_thread_current_ptr)
{ */
ADD r2, r2, 1 # Increment the interrupt counter
STR r2, [r3] # Store it back in the variable
LDR r1, =_tx_thread_current_ptr # Pickup address of current thread ptr
LDR r0, [r1] # Pickup current thread pointer
CMP r0, 0 # Is it NULL?
BEQ __tx_thread_idle_system_save # If so, interrupt occurred in
/* # scheduling loop - nothing needs saving! */
/* Save minimal context of interrupted thread. */
MRS r2, SPSR # Pickup saved SPSR
SUB lr, lr, 4 # Adjust point of interrupt
STMDB sp!, {r2, r10, r12, lr} # Store other registers
/* Save the current stack pointer in the thread's control block. */
/* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */
/* Switch to the system stack. */
/* sp = _tx_thread_system_stack_ptr; */
MOV r10, 0 # Clear stack limit
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
B __tx_irq_processing_return # Continue IRQ processing
/* }
else
{ */
__tx_thread_idle_system_save:
/* Interrupt occurred in the scheduling loop. */
/* Not much to do here, just adjust the stack pointer, and return to IRQ
processing. */
MOV r10, 0 # Clear stack limit
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
ADD sp, sp, 16 # Recover saved registers
B __tx_irq_processing_return # Continue IRQ processing
.type _tx_thread_context_save,$function
.size _tx_thread_context_save,.-_tx_thread_context_save
/* }
} */

View File

@@ -0,0 +1,264 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
SVC_MODE = 0xD3 # SVC mode
FIQ_MODE = 0xD1 # FIQ mode
#ifdef TX_ENABLE_FIQ_SUPPORT
DISABLE_INTS = 0xC0 # Disable IRQ and FIQ interrupts
#else
DISABLE_INTS = 0x80 # Disable IRQ interrupts
#endif
MODE_MASK = 0x1F # Mode mask
IRQ_MODE_BITS = 0x12 # IRQ mode bits
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_fiq_context_restore Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function restores the fiq interrupt context when processing a */
/* nested interrupt. If not, it returns to the interrupt thread if no */
/* preemption is necessary. Otherwise, if preemption is necessary or */
/* if no thread was running, the function returns to the scheduler. */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _tx_thread_schedule Thread scheduling routine */
/* */
/* CALLED BY */
/* */
/* FIQ ISR Interrupt Service Routines */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
/* VOID _tx_thread_fiq_context_restore(VOID)
{ */
.globl _tx_thread_fiq_context_restore
_tx_thread_fiq_context_restore:
/* Lockout interrupts. */
#ifdef TX_BEFORE_ARMV6
MRS r3, CPSR # Pickup current CPSR
ORR r0, r3, DISABLE_INTS # Build interrupt disable value
MSR CPSR_c, r0 # Lockout interrupts
#else
CPSID if # Disable IRQ and FIQ interrupts
#endif
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR exit function to indicate an ISR is complete. */
BL _tx_execution_isr_exit # Call the ISR exit function
#endif
/* Determine if interrupts are nested. */
/* if (--_tx_thread_system_state)
{ */
LDR r3, =_tx_thread_system_state # Pickup address of system state var
LDR r2, [r3] # Pickup system state
SUB r2, r2, 1 # Decrement the counter
STR r2, [r3] # Store the counter
CMP r2, 0 # Was this the first interrupt?
BEQ __tx_thread_fiq_not_nested_restore # If so, not a nested restore
/* Interrupts are nested. */
/* Just recover the saved registers and return to the point of
interrupt. */
LDMIA sp!, {r0, r10, r12, lr} # Recover SPSR, POI, and scratch regs
MSR SPSR_cxsf, r0 # Put SPSR back
LDMIA sp!, {r0-r3} # Recover r0-r3
MOVS pc, lr # Return to point of interrupt
/* } */
__tx_thread_fiq_not_nested_restore:
/* Determine if a thread was interrupted and no preemption is required. */
/* else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr)
|| (_tx_thread_preempt_disable))
{ */
LDR r1, [sp] # Pickup the saved SPSR
MOV r2, MODE_MASK # Build mask to isolate the interrupted mode
AND r1, r1, r2 # Isolate mode bits
CMP r1, IRQ_MODE_BITS # Was an interrupt taken in IRQ mode before we
/* # got to context save? */
BEQ __tx_thread_fiq_no_preempt_restore # Yes, just go back to point of interrupt
LDR r1, =_tx_thread_current_ptr # Pickup address of current thread ptr
LDR r0, [r1] # Pickup actual current thread pointer
CMP r0, 0 # Is it NULL?
BEQ __tx_thread_fiq_idle_system_restore # Yes, idle system was interrupted
LDR r3, =_tx_thread_preempt_disable # Pickup preempt disable address
LDR r2, [r3] # Pickup actual preempt disable flag
CMP r2, 0 # Is it set?
BNE __tx_thread_fiq_no_preempt_restore # Yes, don't preempt this thread
LDR r3, =_tx_thread_execute_ptr # Pickup address of execute thread ptr
LDR r2, [r3] # Pickup actual execute thread pointer
CMP r0, r2 # Is the same thread highest priority?
BNE __tx_thread_fiq_preempt_restore # No, preemption needs to happen
__tx_thread_fiq_no_preempt_restore:
/* Restore interrupted thread or ISR. */
/* Pickup the saved stack pointer. */
/* tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; */
/* Recover the saved context and return to the point of interrupt. */
LDMIA sp!, {r0, lr} # Recover SPSR, POI, and scratch regs
MSR SPSR_cxsf, r0 # Put SPSR back
LDMIA sp!, {r0-r3} # Recover r0-r3
MOVS pc, lr # Return to point of interrupt
/* }
else
{ */
__tx_thread_fiq_preempt_restore:
LDMIA sp!, {r3, lr} # Recover temporarily saved registers
MOV r1, lr # Save lr (point of interrupt)
MOV r2, SVC_MODE # Build SVC mode CPSR
MSR CPSR_c, r2 # Enter SVC mode
STR r1, [sp, -4]! # Save point of interrupt
STMDB sp!, {r4-r12, lr} # Save upper half of registers
MOV r4, r3 # Save SPSR in r4
MOV r2, FIQ_MODE # Build FIQ mode CPSR
MSR CPSR_c, r2 # Re-enter FIQ mode
LDMIA sp!, {r0-r3} # Recover r0-r3
MOV r5, SVC_MODE # Build SVC mode CPSR
MSR CPSR_c, r5 # Enter SVC mode
STMDB sp!, {r0-r3} # Save r0-r3 on thread's stack
LDR r1, =_tx_thread_current_ptr # Pickup address of current thread ptr
LDR r0, [r1] # Pickup current thread pointer
#ifdef __VFP__
LDR r2, [r0, 144] # Pickup the VFP enabled flag
CMP r2, 0 # Is the VFP enabled?
BEQ _tx_skip_fiq_vfp_save # No, skip VFP IRQ save
VMRS r2, FPSCR # Pickup the FPSCR
STR r2, [sp, -4]! # Save FPSCR
VSTMDB sp!, {D16-D31} # Save D16-D31
VSTMDB sp!, {D0-D15} # Save D0-D15
_tx_skip_fiq_vfp_save:
#endif
MOV r3, 1 # Build interrupt stack type
STMDB sp!, {r3, r4} # Save interrupt stack type and SPSR
STR sp, [r0, 8] # Save stack pointer in thread control
/* # block */
#ifdef TX_ENABLE_EVENT_LOGGING
MOV r4, r0 # Save r0
MOV r5, r1 # Save r1
BL _tx_el_thread_preempted # Call thread preempted routine
MOV r0, r4 # Restore r0
MOV r1, r5 # Restore r1
#endif
/* Save the remaining time-slice and disable it. */
/* if (_tx_timer_time_slice)
{ */
LDR r3, =_tx_timer_time_slice # Pickup time-slice variable address
LDR r2, [r3] # Pickup time-slice
CMP r2, 0 # Is it active?
BEQ __tx_thread_fiq_dont_save_ts # No, don't save it
/* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice;
_tx_timer_time_slice = 0; */
STR r2, [r0, 24] # Save thread's time-slice
MOV r2, 0 # Clear value
STR r2, [r3] # Disable global time-slice flag
/* } */
__tx_thread_fiq_dont_save_ts:
/* Clear the current task pointer. */
/* _tx_thread_current_ptr = TX_NULL; */
MOV r0, 0 # NULL value
STR r0, [r1] # Clear current thread pointer
/* Return to the scheduler. */
/* _tx_thread_schedule(); */
B _tx_thread_schedule # Return to scheduler
/* } */
__tx_thread_fiq_idle_system_restore:
/* Just return back to the scheduler! */
ADD sp, sp, 24 # Recover FIQ stack space
MOV r3, SVC_MODE # Build SVC mode CPSR
MSR CPSR_c, r3 # Lockout interrupts
B _tx_thread_schedule # Return to scheduler
.type _tx_thread_fiq_context_restore,$function
.size _tx_thread_fiq_context_restore,.-_tx_thread_fiq_context_restore
/* } */

View File

@@ -0,0 +1,197 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_fiq_context_save Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function saves the context of an executing thread in the */
/* beginning of interrupt processing. The function also ensures that */
/* the system stack is used upon return to the calling ISR. */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* ISRs */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
/* VOID _tx_thread_fiq_context_save(VOID)
{ */
.globl _tx_thread_fiq_context_save
_tx_thread_fiq_context_save:
/* Upon entry to this routine, it is assumed that IRQ interrupts are locked
out, we are in IRQ mode, and all registers are intact. */
/* Check for a nested interrupt condition. */
/* if (_tx_thread_system_state++)
{ */
STMDB sp!, {r0-r3} # Save some working registers
LDR r3, =_tx_thread_system_state # Pickup address of system state var
LDR r2, [r3] # Pickup system state
CMP r2, 0 # Is this the first interrupt?
BEQ __tx_thread_fiq_not_nested_save # Yes, not a nested context save
/* Nested interrupt condition. */
ADD r2, r2, 1 # Increment the interrupt counter
STR r2, [r3] # Store it back in the variable
/* Save the rest of the scratch registers on the stack and return to the
calling ISR. */
MRS r0, SPSR # Pickup saved SPSR
SUB lr, lr, 4 # Adjust point of interrupt
STMDB sp!, {r0, r10, r12, lr} # Store other registers
/* Return to the ISR. */
MOV r10, 0 # Clear stack limit
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
B __tx_fiq_processing_return # Continue FIQ processing
__tx_thread_fiq_not_nested_save:
/* } */
/* Otherwise, not nested, check to see if a thread was running. */
/* else if (_tx_thread_current_ptr)
{ */
ADD r2, r2, 1 # Increment the interrupt counter
STR r2, [r3] # Store it back in the variable
LDR r1, =_tx_thread_current_ptr # Pickup address of current thread ptr
LDR r0, [r1] # Pickup current thread pointer
CMP r0, 0 # Is it NULL?
BEQ __tx_thread_fiq_idle_system_save # If so, interrupt occurred in
/* # scheduling loop - nothing needs saving! */
/* Save minimal context of interrupted thread. */
MRS r2, SPSR # Pickup saved SPSR
SUB lr, lr, 4 # Adjust point of interrupt
STMDB sp!, {r2, lr} # Store other registers, Note that we don't
/* # need to save sl and ip since FIQ has
# copies of these registers. Nested
# interrupt processing does need to save
# these registers. */
/* Save the current stack pointer in the thread's control block. */
/* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */
/* Switch to the system stack. */
/* sp = _tx_thread_system_stack_ptr; */
MOV r10, 0 # Clear stack limit
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
B __tx_fiq_processing_return # Continue FIQ processing
/* }
else
{ */
__tx_thread_fiq_idle_system_save:
/* Interrupt occurred in the scheduling loop. */
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
/* Not much to do here, save the current SPSR and LR for possible
use in IRQ interrupted in idle system conditions, and return to
FIQ interrupt processing. */
MRS r0, SPSR # Pickup saved SPSR
SUB lr, lr, 4 # Adjust point of interrupt
STMDB sp!, {r0, lr} # Store other registers that will get used
/* # or stripped off the stack in context
# restore */
B __tx_fiq_processing_return # Continue FIQ processing
.type _tx_thread_fiq_context_save,$function
.size _tx_thread_fiq_context_save,.-_tx_thread_fiq_context_save
/* }
} */

View File

@@ -0,0 +1,109 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
DISABLE_INTS = 0xC0 # Disable IRQ and FIQ interrupts
#else
DISABLE_INTS = 0x80 # Disable IRQ interrupts
#endif
MODE_MASK = 0x1F # Mode mask
FIQ_MODE_BITS = 0x11 # FIQ mode bits
SVC_MODE_BITS = 0x13 # SVC mode value */
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_fiq_nesting_end Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is called by the application from FIQ mode after */
/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */
/* processing from system mode back to FIQ mode prior to the ISR */
/* calling _tx_thread_fiq_context_restore. Note that this function */
/* assumes the system stack pointer is in the same position after */
/* nesting start function was called. */
/* */
/* This function assumes that the system mode stack pointer was setup */
/* during low-level initialization (tx_initialize_low_level.arm). */
/* */
/* This function returns with FIQ interrupts disabled. */
/* */
/* 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_fiq_nesting_end(VOID)
{ */
.globl _tx_thread_fiq_nesting_end
_tx_thread_fiq_nesting_end:
MOV r3,lr # Save ISR return address
MRS r0, CPSR # Pickup the CPSR
ORR r0, r0, DISABLE_INTS # Build disable interrupt value
MSR CPSR_c, r0 # Disable interrupts
LDR lr, [sp] # Pickup saved lr
ADD sp, sp, 4 # Adjust stack pointer
BIC r0, r0, MODE_MASK # Clear mode bits
ORR r0, r0, FIQ_MODE_BITS # Build IRQ mode CPSR
MSR CPSR_c, r0 # Re-enter IRQ mode
MOV pc, r3 # Return to ISR
.type _tx_thread_fiq_nesting_end,$function
.size _tx_thread_fiq_nesting_end,.-_tx_thread_fiq_nesting_end
/* } */

View File

@@ -0,0 +1,103 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
FIQ_DISABLE = 0x40 # FIQ disable bit
MODE_MASK = 0x1F # Mode mask
SYS_MODE_BITS = 0x1F # System mode bits
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_fiq_nesting_start Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is called by the application from FIQ mode after */
/* _tx_thread_fiq_context_save has been called and switches the FIQ */
/* processing to the system mode so nested FIQ interrupt processing */
/* is possible (system mode has its own "lr" register). Note that */
/* this function assumes that the system mode stack pointer was setup */
/* during low-level initialization (tx_initialize_low_level.arm). */
/* */
/* This function returns with FIQ interrupts enabled. */
/* */
/* 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_fiq_nesting_start(VOID)
{ */
.globl _tx_thread_fiq_nesting_start
_tx_thread_fiq_nesting_start:
MOV r3,lr # Save ISR return address
MRS r0, CPSR # Pickup the CPSR
BIC r0, r0, MODE_MASK # Clear the mode bits
ORR r0, r0, SYS_MODE_BITS # Build system mode CPSR
MSR CPSR_c, r0 # Enter system mode
STR lr, [sp, -4]! # Push the system mode lr on the system mode stack
BIC r0, r0, FIQ_DISABLE # Build enable FIQ CPSR
MSR CPSR_c, r0 # Enter system mode
MOV pc, r3 # Return to ISR
.type _tx_thread_fiq_nesting_start,$function
.size _tx_thread_fiq_nesting_start,.-_tx_thread_fiq_nesting_start
/* } */

View File

@@ -0,0 +1,101 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
INT_MASK = 0xC0 # Interrupt bit mask
#else
INT_MASK = 0x80 # Interrupt bit mask
#endif
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_interrupt_control Cortex-A9/Green Hills */
/* 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)
{ */
.globl _tx_thread_interrupt_control
_tx_thread_interrupt_control:
/* Pickup current interrupt lockout posture. */
MRS r3, CPSR # Pickup current CPSR
BIC r1, r3, INT_MASK # Clear interrupt lockout bits
ORR r1, r1, r0 # Or-in new interrupt lockout bits
/* Apply the new interrupt posture. */
MSR CPSR_c, r1 # Setup new CPSR
AND r0, r3, INT_MASK # Return previous interrupt mask
RET # Return to caller
.type _tx_thread_interrupt_control,$function
.size _tx_thread_interrupt_control,.-_tx_thread_interrupt_control
/* } */

View File

@@ -0,0 +1,105 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
DISABLE_INTS = 0xC0 # IRQ & FIQ interrupts disabled
#else
DISABLE_INTS = 0x80 # IRQ interrupts disabled
#endif
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_interrupt_disable Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is responsible for disabling interrupts */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* old_posture Old interrupt lockout posture */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
/* UINT _tx_thread_interrupt_disable(void)
{ */
.globl _tx_thread_interrupt_disable
_tx_thread_interrupt_disable:
/* Pickup current interrupt lockout posture. */
MRS r0, CPSR # Pickup current CPSR
/* Mask interrupts. */
#ifdef TX_BEFORE_ARMV6
ORR r1, r0, DISABLE_INTS # Mask interrupts
MSR CPSR_c, r1 # Setup new CPSR
#else
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSID if # Disable IRQ and FIQ
#else
CPSID i # Disable IRQ
#endif
#endif
RET # Return previous CPSR value
.type _tx_thread_interrupt_disable,$function
.size _tx_thread_interrupt_disable,.-_tx_thread_interrupt_disable
/* } */

View File

@@ -0,0 +1,85 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h" */
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_interrupt_restore Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is responsible for restoring interrupts to the state */
/* returned by a previous _tx_thread_interrupt_disable call. */
/* */
/* INPUT */
/* */
/* new_posture New 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 */
/* */
/**************************************************************************/
/* VOID _tx_thread_interrupt_restore(UINT new_posture)
{ */
.globl _tx_thread_interrupt_restore
_tx_thread_interrupt_restore:
/* Apply the new interrupt posture. */
MSR CPSR_c, r0 # Setup new CPSR
RET
.type _tx_thread_interrupt_restore,$function
.size _tx_thread_interrupt_restore,.-_tx_thread_interrupt_restore
/* } */

View File

@@ -0,0 +1,109 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
DISABLE_INTS = 0xC0 # Disable IRQ and FIQ interrupts
#else
DISABLE_INTS = 0x80 # Disable IRQ interrupts
#endif
MODE_MASK = 0x1F # Mode mask
IRQ_MODE_BITS = 0x12 # IRQ mode bits
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_irq_nesting_end Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is called by the application from IRQ mode after */
/* _tx_thread_irq_nesting_start has been called and switches the IRQ */
/* processing from system mode back to IRQ mode prior to the ISR */
/* calling _tx_thread_context_restore. Note that this function */
/* assumes the system stack pointer is in the same position after */
/* nesting start function was called. */
/* */
/* This function assumes that the system mode stack pointer was setup */
/* during low-level initialization (tx_initialize_low_level.arm). */
/* */
/* This function returns with IRQ interrupts disabled. */
/* */
/* 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_irq_nesting_end(VOID)
{ */
.globl _tx_thread_irq_nesting_end
_tx_thread_irq_nesting_end:
MOV r3,lr # Save ISR return address
MRS r0, CPSR # Pickup the CPSR
ORR r0, r0, DISABLE_INTS # Build disable interrupt value
MSR CPSR_c, r0 # Disable interrupts
LDR lr, [sp] # Pickup saved lr
ADD sp, sp, 4 # Adjust stack pointer
BIC r0, r0, MODE_MASK # Clear mode bits
ORR r0, r0, IRQ_MODE_BITS # Build IRQ mode CPSR
MSR CPSR_c, r0 # Re-enter IRQ mode
MOV pc, r3 # Return to ISR
.type _tx_thread_irq_nesting_end,$function
.size _tx_thread_irq_nesting_end,.-_tx_thread_irq_nesting_end
/* } */

View File

@@ -0,0 +1,102 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
IRQ_DISABLE = 0x80 # IRQ disable bit
MODE_MASK = 0x1F # Mode mask
SYS_MODE_BITS = 0x1F # System mode bits
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_irq_nesting_start Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function is called by the application from IRQ mode after */
/* _tx_thread_context_save has been called and switches the IRQ */
/* processing to the system mode so nested IRQ interrupt processing */
/* is possible (system mode has its own "lr" register). Note that */
/* this function assumes that the system mode stack pointer was setup */
/* during low-level initialization (tx_initialize_low_level.arm). */
/* */
/* This function returns with IRQ interrupts enabled. */
/* */
/* 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_irq_nesting_start(VOID)
{ */
.globl _tx_thread_irq_nesting_start
_tx_thread_irq_nesting_start:
MOV r3,lr # Save ISR return address
MRS r0, CPSR # Pickup the CPSR
BIC r0, r0, MODE_MASK # Clear the mode bits
ORR r0, r0, SYS_MODE_BITS # Build system mode CPSR
MSR CPSR_c, r0 # Enter system mode
STR lr, [sp, -4]! # Push the system mode lr on the system mode stack
BIC r0, r0, IRQ_DISABLE # Build enable IRQ CPSR
MSR CPSR_c, r0 # Enter system mode
MOV pc, r3 # Return to ISR
.type _tx_thread_irq_nesting_start,$function
.size _tx_thread_irq_nesting_start,.-_tx_thread_irq_nesting_start
/* } */

View File

@@ -0,0 +1,254 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
ENABLE_INTS = 0xC0 # IRQ & FIQ Interrupts enabled mask
#else
ENABLE_INTS = 0x80 # IRQ Interrupts enabled mask
#endif
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_schedule Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function waits for a thread control block pointer to appear in */
/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */
/* in the variable, the corresponding thread is resumed. */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _tx_initialize_kernel_enter ThreadX entry function */
/* _tx_thread_system_return Return to system from thread */
/* _tx_thread_context_restore Restore thread's context */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
/* VOID _tx_thread_schedule(VOID)
{ */
.globl _tx_thread_schedule
_tx_thread_schedule:
/* Enable interrupts. */
#ifdef TX_BEFORE_ARMV6
MRS r2, CPSR # Pickup CPSR
BIC r0, r2, ENABLE_INTS # Clear the disable bit(s)
MSR CPSR_c, r0 # Enable interrupts
#else
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSIE if # Enable IRQ and FIQ interrupts
#else
CPSIE i # Enable IRQ interrupts
#endif
#endif
/* Wait for a thread to execute. */
/* do
{ */
LDR r1, =_tx_thread_execute_ptr # Address of thread execute ptr
__tx_thread_schedule_loop:
LDR r0, [r1] # Pickup next thread to execute
CMP r0, 0 # Is it NULL?
BEQ __tx_thread_schedule_loop # If so, keep looking for a thread
/* }
while(_tx_thread_execute_ptr == TX_NULL); */
/* Yes! We have a thread to execute. Lockout interrupts and
transfer control to it. */
#ifdef TX_BEFORE_ARMV6
MSR CPSR_c, r2 # Disable interrupts
#else
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSID if # Disable IRQ and FIQ interrupts
#else
CPSID i # Disable IRQ interrupts
#endif
#endif
/* Setup the current thread pointer. */
/* _tx_thread_current_ptr = _tx_thread_execute_ptr; */
#ifdef TX_ENABLE_EVENT_LOGGING
MOV v1, r0 # Save temp register in non-volatile register
BL _tx_el_thread_running # Call event logging routine
MOV r0, v1 # Restore temp register
#endif
LDR r1, =_tx_thread_current_ptr # Pickup address of current thread
STR r0, [r1] # Setup current thread pointer
/* Increment the run count for this thread. */
/* _tx_thread_current_ptr -> tx_thread_run_count++; */
LDR r2, [r0, 4] # Pickup run counter
LDR r3, [r0, 24] # Pickup time-slice for this thread
ADD r2, r2, 1 # Increment thread run-counter
STR r2, [r0, 4] # Store the new run counter
/* Setup time-slice, if present. */
/* _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; */
LDR r2, =_tx_timer_time_slice # Pickup address of time slice
/* # variable */
LDR sp, [r0, 8] # Switch stack pointers
STR r3, [r2] # Setup time-slice
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the thread entry function to indicate the thread is executing. */
MOV r5, r0 # Save r0
BL _tx_execution_thread_enter # Call the thread execution enter function
MOV r0, r5 # Restore r0
#endif
/* Switch to the thread's stack. */
/* sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; */
/* Determine if an interrupt frame or a synchronous task suspension frame
is present. */
LDMIA sp!, {r4, r5} # Pickup the stack type and saved CPSR
CMP r4, 0 # Check for synchronous context switch
BEQ _tx_solicited_return
MSR SPSR_cxsf, r5 # Setup SPSR for return
#ifdef __VFP__
LDR r1, [r0, 144] # Pickup the VFP enabled flag
CMP r1, 0 # Is the VFP enabled?
BEQ _tx_skip_interrupt_vfp_restore # No, skip VFP interrupt restore
VLDMIA sp!, {D0-D15} # Recover D0-D15
VLDMIA sp!, {D16-D31} # Recover D16-D31
LDR r4, [sp], 4 # Pickup FPSCR
VMSR FPSCR, r4 # Restore FPSCR
_tx_skip_interrupt_vfp_restore:
#endif
LDMIA sp!, {r0-r12, lr, pc}^ # Return to point of thread interrupt
_tx_solicited_return:
#ifdef __VFP__
LDR r1, [r0, 144] # Pickup the VFP enabled flag
CMP r1, 0 # Is the VFP enabled?
BEQ _tx_skip_solicited_vfp_restore # No, skip VFP solicited restore
VLDMIA sp!, {D8-D15} # Recover D8-D15
VLDMIA sp!, {D16-D31} # Recover D16-D31
LDR r4, [sp], 4 # Pickup FPSCR
VMSR FPSCR, r4 # Restore FPSCR
_tx_skip_solicited_vfp_restore:
#endif
MSR CPSR_cxsf, r5 # Recover CPSR
LDMIA sp!, {r4-r11, lr} # Return to thread synchronously
RET # Return to caller (Thumb safe)
.type _tx_thread_schedule,$function
.size _tx_thread_schedule,.-_tx_thread_schedule
#ifdef __VFP__
.globl tx_thread_vfp_enable
tx_thread_vfp_enable:
MRS r2, CPSR # Pickup the CPSR
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSIE if # Enable IRQ and FIQ interrupts
#else
CPSIE i # Enable IRQ interrupts
#endif
LDR r0, =_tx_thread_current_ptr # Build current thread pointer address
LDR r1, [r0] # Pickup current thread pointer
CMP r1, 0 # Check for NULL thread pointer
BEQ __tx_no_thread_to_enable # If NULL, skip VFP enable
MOV r0, 1 # Build enable value
STR r0, [r1, 144] # Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD)
__tx_no_thread_to_enable:
MSR CPSR_cxsf, r2 # Recover CPSR
RET # Return to caller (Thumb safe)
.type tx_thread_vfp_enable,$function
.size tx_thread_vfp_enable,.-tx_thread_vfp_enable
.globl tx_thread_vfp_disable
tx_thread_vfp_disable:
MRS r2, CPSR # Pickup the CPSR
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSIE if # Enable IRQ and FIQ interrupts
#else
CPSIE i # Enable IRQ interrupts
#endif
LDR r0, =_tx_thread_current_ptr # Build current thread pointer address
LDR r1, [r0] # Pickup current thread pointer
CMP r1, 0 # Check for NULL thread pointer
BEQ __tx_no_thread_to_disable # If NULL, skip VFP disable
MOV r0, 0 # Build disable value
STR r0, [r1, 144] # Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD)
__tx_no_thread_to_disable:
MSR CPSR_cxsf, r2 # Recover CPSR
RET # Return to caller (Thumb safe)
.type tx_thread_vfp_disable,$function
.size tx_thread_vfp_disable,.-tx_thread_vfp_disable
#endif
/* } */

View File

@@ -0,0 +1,161 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h" */
SVC_MODE = 0x13 # SVC mode
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSR_MASK = 0xDF # Mask initial CPSR, IRQ & FIQ ints enabled
#else
CPSR_MASK = 0x9F # Mask initial CPSR, IRQ ints enabled
#endif
THUMB_BIT = 0x20 # Thumb-bit
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_stack_build Cortex-A9/Green Hills */
/* 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))
{ */
.globl _tx_thread_stack_build
_tx_thread_stack_build:
/* Build a fake interrupt frame. The form of the fake interrupt stack
on the Cortex-A9 should look like the following after it is built:
Stack Top: 1 Interrupt stack frame type
CPSR Initial value for CPSR
r0 (a1) Initial value for r0
r1 (a2) Initial value for r1
r2 (a3) Initial value for r2
r3 (a4) Initial value for r3
r4 (v1) Initial value for r4
r5 (v2) Initial value for r5
r6 (v3) Initial value for r6
r7 (v4) Initial value for r7
r8 (v5) Initial value for r8
r9 (sb) Initial value for r9
r10 (sl) Initial value for r10
r11 (fp) Initial value for r11
r12 (ip) Initial value for r12
lr Initial value for lr
pc Initial value for pc
0 For stack backtracing
Stack Bottom: (higher memory address) */
LDR r2, [r0, 16] # Pickup end of stack area
BIC r2, r2, 7 # Ensure 8-byte alignment
SUB r2, r2, 76 # Allocate space for the stack frame
/* Actually build the stack frame. */
MOV r3, 1 # Build interrupt stack type
STR r3, [r2] # Store stack type
MOV r3, 0 # Build initial register value
STR r3, [r2, 8] # Store initial r0
STR r3, [r2, 12] # Store initial r1
STR r3, [r2, 16] # Store initial r2
STR r3, [r2, 20] # Store initial r3
STR r3, [r2, 24] # Store initial r4
STR r3, [r2, 28] # Store initial r5
STR r3, [r2, 32] # Store initial r6
STR r3, [r2, 36] # Store initial r7
STR r3, [r2, 40] # Store initial r8
STR r3, [r2, 44] # Store initial r9
LDR r3, [r0, 12] # Pickup stack starting address
STR r3, [r2, 48] # Store initial r10
MOV r3, 0 # Build initial register value
STR r3, [r2, 52] # Store initial r11
STR r3, [r2, 56] # Store initial r12
STR r3, [r2, 60] # Store initial lr
STR r1, [r2, 64] # Store initial pc
STR r3, [r2, 68] # 0 for back-trace
MRS r3, CPSR # Pickup CPSR
BIC r3, r3, CPSR_MASK # Mask mode bits of CPSR
ORR r3, r3, SVC_MODE # Build CPSR, SVC mode, interrupts enabled
BIC r3, r3, #THUMB_BIT # Clear Thumb-bit by default
AND r1, r1, #1 # Determine if the entry function is in Thumb mode
CMP r1, 1 # Is the Thumb-bit set?
ORREQ r3, r3, #THUMB_BIT # Yes, set the Thumb-bit
STR r3, [r2, 4] # Store initial CPSR
/* Setup stack pointer. */
/* thread_ptr -> tx_thread_stack_ptr = r2; */
STR r2, [r0, 8] # Save stack pointer in thread's
/* # control block */
RET # Return to caller
.type _tx_thread_stack_build,$function
.size _tx_thread_stack_build,.-_tx_thread_stack_build
/* } */

View File

@@ -0,0 +1,167 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
DISABLE_INTS = 0xC0 # IRQ & FIQ interrupts disabled
#else
DISABLE_INTS = 0x80 # IRQ interrupts disabled
#endif
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_system_return Cortex-A9/Green Hills */
/* 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)
{ */
.globl _tx_thread_system_return
_tx_thread_system_return:
/* Save minimal context on the stack. */
MOV r0, 0 # Build a solicited stack type
MRS r1, CPSR # Pickup the CPSR
STMDB sp!, {r4-r11, lr} # Save minimal context
LDR r4, =_tx_thread_current_ptr # Pickup address of current ptr
LDR r5, [r4] # Pickup current thread pointer
#ifdef __VFP__
LDR r1, [r5, 144] # Pickup the VFP enabled flag
CMP r1, 0 # Is the VFP enabled?
BEQ _tx_skip_solicited_vfp_save # No, skip VFP solicited save
VMRS r1, FPSCR # Pickup the FPSCR
STR r1, [sp, -4]! # Save FPSCR
VSTMDB sp!, {D16-D31} # Save D16-D31
VSTMDB sp!, {D8-D15} # Save D8-D15
_tx_skip_solicited_vfp_save:
#endif
MOV r0, #0 # Build a solicited stack type
MRS r1, CPSR # Pickup the CPSR
STMDB sp!, {r0-r1} # Save type and CPSR
/* Lockout interrupts. */
#ifdef TX_BEFORE_ARMV6
ORR r2, r1, DISABLE_INTS # Build disable interrupt CPSR
MSR CPSR_c, r2 # Disable interrupts
#else
#ifdef TX_ENABLE_FIQ_SUPPORT
CPSID if # Disable IRQ and FIQ interrupts
#else
CPSID i # Disable IRQ interrutps
#endif
#endif
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the thread exit function to indicate the thread is no longer executing. */
BL _tx_execution_thread_exit # Call the thread exit function
#endif
MOV r3, r4 # Pickup address of current ptr
MOV r0, r5 # Pickup current thread pointer
LDR r2, =_tx_timer_time_slice # Pickup address of time slice
LDR r1, [r2] # Pickup current time slice
/* Save current stack and switch to system stack. */
/* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp;
sp = _tx_thread_system_stack_ptr; */
STR sp, [r0, 8] # Save thread stack pointer
/* Determine if the time-slice is active. */
/* if (_tx_timer_time_slice)
{ */
MOV r4, 0 # Build clear value
CMP r1, 0 # Is a time-slice active?
BEQ __tx_thread_dont_save_ts # No, don't save the current time-slice
/* Save time-slice for the thread and clear the current time-slice. */
/* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice;
_tx_timer_time_slice = 0; */
STR r4, [r2, 0] # Clear time-slice
STR r1, [r0, 24] # Save current time-slice
/* } */
__tx_thread_dont_save_ts:
/* Clear the current thread pointer. */
/* _tx_thread_current_ptr = TX_NULL; */
STR r4, [r3] # Clear current thread pointer
B _tx_thread_schedule # Jump to scheduler!
.type _tx_thread_system_return,$function
.size _tx_thread_system_return,.-_tx_thread_system_return
/* } */

View File

@@ -0,0 +1,196 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Thread */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_thread.h"
#include "tx_timer.h" */
#ifdef TX_ENABLE_FIQ_SUPPORT
DISABLE_INTS = 0xC0 # IRQ & FIQ interrupts disabled
#else
DISABLE_INTS = 0x80 # IRQ interrupts disabled
#endif
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_thread_vectored_context_save Cortex-A9/Green Hills */
/* 6.1 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function saves the context of an executing thread in the */
/* beginning of interrupt processing. The function also ensures that */
/* the system stack is used upon return to the calling ISR. */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* ISRs */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
/* VOID _tx_thread_vectored_context_save(VOID)
{ */
.globl _tx_thread_vectored_context_save
_tx_thread_vectored_context_save:
/* Upon entry to this routine, it is assumed that IRQ interrupts are locked
out, we are in IRQ mode, the minimal context is already saved, and the
lr register contains the return ISR address. */
/* Check for a nested interrupt condition. */
/* if (_tx_thread_system_state++)
{ */
#ifdef TX_ENABLE_FIQ_SUPPORT
#ifdef TX_BEFORE_ARMV6
MRS r0, CPSR # Pickup the CPSR
ORR r0, r0, DISABLE_INTS # Build disable interrupt CPSR
MSR CPSR_c, r0 # Disable interrupts
#else
CPSID if # Disable IRQ and FIQ interrupts
#endif
#endif
LDR r3, =_tx_thread_system_state # Pickup address of system state var
LDR r2, [r3] # Pickup system state
CMP r2, 0 # Is this the first interrupt?
BEQ __tx_thread_not_nested_save # Yes, not a nested context save
/* Nested interrupt condition. */
ADD r2, r2, 1 # Increment the interrupt counter
STR r2, [r3] # Store it back in the variable
/* Note: Minimal context of interrupted thread is already saved. */
/* Return to the ISR. */
MOV r10, 0 # Clear stack limit
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
MOV pc, lr # Return to caller
__tx_thread_not_nested_save:
/* } */
/* Otherwise, not nested, check to see if a thread was running. */
/* else if (_tx_thread_current_ptr)
{ */
ADD r2, r2, 1 # Increment the interrupt counter
STR r2, [r3] # Store it back in the variable
LDR r1, =_tx_thread_current_ptr # Pickup address of current thread ptr
LDR r0, [r1] # Pickup current thread pointer
CMP r0, 0 # Is it NULL?
BEQ __tx_thread_idle_system_save # If so, interrupt occurred in
/* # scheduling loop - nothing needs saving! */
/* Note: Minimal context of interrupted thread is already saved. */
/* Save the current stack pointer in the thread's control block. */
/* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */
/* Switch to the system stack. */
/* sp = _tx_thread_system_stack_ptr; */
MOV r10, 0 # Clear stack limit
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
MOV pc, lr # Return to caller
/* }
else
{ */
__tx_thread_idle_system_save:
/* Interrupt occurred in the scheduling loop. */
/* Not much to do here, just adjust the stack pointer, and return to IRQ
processing. */
MOV r10, 0 # Clear stack limit
#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
/* Call the ISR enter function to indicate an ISR is executing. */
PUSH {lr} # Save ISR lr
BL _tx_execution_isr_enter # Call the ISR enter function
POP {lr} # Recover ISR lr
#endif
ADD sp, sp, 32 # Recover saved registers
MOV pc, lr # Return to caller
.type _tx_thread_vectored_context_save,$function
.size _tx_thread_vectored_context_save,.-_tx_thread_vectored_context_save
/* }
} */

View File

@@ -0,0 +1,241 @@
/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** ThreadX Component */
/** */
/** Timer */
/** */
/**************************************************************************/
/**************************************************************************/
/* #define TX_SOURCE_CODE */
/* Include necessary system files. */
/* #include "tx_api.h"
#include "tx_timer.h"
#include "tx_thread.h" */
.text
.align 4
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _tx_timer_interrupt Cortex-A9/Green Hills */
/* 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 Process timer expiration */
/* _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)
{ */
.globl _tx_timer_interrupt
_tx_timer_interrupt:
/* Upon entry to this routine, it is assumed that context save has already
been called, and therefore the compiler scratch registers are available
for use. */
/* Increment the system clock. */
/* _tx_timer_system_clock++; */
LDR r1, =_tx_timer_system_clock # Pickup address of system clock
LDR r0, [r1] # Pickup system clock
ADD r0, r0, 1 # Increment system clock
STR r0, [r1] # Store new system clock
/* Test for time-slice expiration. */
/* if (_tx_timer_time_slice)
{ */
LDR r3, =_tx_timer_time_slice # Pickup address of time-slice
LDR r2, [r3] # Pickup time-slice
CMP r2, 0 # Is it non-active?
BEQ __tx_timer_no_time_slice # Yes, skip time-slice processing
/* Decrement the time_slice. */
/* _tx_timer_time_slice--; */
SUB r2, r2, 1 # Decrement the time-slice
STR r2, [r3] # Store new time-slice value
/* Check for expiration. */
/* if (__tx_timer_time_slice == 0) */
CMP r2, 0 # Has it expired?
BNE __tx_timer_no_time_slice # No, skip expiration processing
/* Set the time-slice expired flag. */
/* _tx_timer_expired_time_slice = TX_TRUE; */
LDR r3,=_tx_timer_expired_time_slice # Pickup address of expired flag
MOV r0, 1 # Build expired value
STR r0, [r3] # Set time-slice expiration flag
/* } */
__tx_timer_no_time_slice:
/* Test for timer expiration. */
/* if (*_tx_timer_current_ptr)
{ */
LDR r1, =_tx_timer_current_ptr # Pickup current timer pointer addr
LDR r0, [r1] # Pickup current timer
LDR r2, [r0] # Pickup timer list entry
CMP r2, 0 # Is there anything in the list?
BEQ __tx_timer_no_timer # No, just increment the timer
/* Set expiration flag. */
/* _tx_timer_expired = TX_TRUE; */
LDR r3, =_tx_timer_expired # Pickup expiration flag address
MOV r2, 1 # Build expired value
STR r2, [r3] # Set expired flag
B __tx_timer_done # Finished timer processing
/* }
else
{ */
__tx_timer_no_timer:
/* No timer expired, increment the timer pointer. */
/* _tx_timer_current_ptr++; */
ADD r0, r0, 4 # Move to next timer
/* Check for 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] # 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] # Set current pointer to list start
__tx_timer_skip_wrap:
STR r0, [r1] # Store new current timer pointer
/* } */
__tx_timer_done:
/* See if anything has expired. */
/* if ((_tx_timer_expired_time_slice) || (_tx_timer_expired))
{ */
LDR r3, =_tx_timer_expired_time_slice # Pickup addr of expired flag
LDR r2, [r3] # Pickup time-slice expired flag
CMP r2, 0 # Did a time-slice expire?
BNE __tx_something_expired # If non-zero, time-slice expired
LDR r1, =_tx_timer_expired # Pickup addr of other expired flag
LDR r0, [r1] # Pickup timer expired flag
CMP r0, 0 # Did a timer expire?
BEQ __tx_timer_nothing_expired # No, nothing expired
__tx_something_expired:
STMDB sp!, {r0, lr} # Save the lr register on the stack
/* # and save r0 just to keep 8-byte alignment */
/* Did a timer expire? */
/* if (_tx_timer_expired)
{ */
LDR r1, =_tx_timer_expired # Pickup addr of expired flag
LDR r0, [r1] # Pickup timer expired flag
CMP r0, 0 # Check for timer expiration
BEQ __tx_timer_dont_activate # If not set, skip timer activation
/* Process the 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] # Pickup the actual flag
CMP r2, 0 # See if the flag is set
BEQ __tx_timer_not_ts_expiration # No, skip time-slice processing
/* Time slice interrupted thread. */
/* _tx_thread_time_slice(); */
BL _tx_thread_time_slice # Call time-slice processing
/* } */
__tx_timer_not_ts_expiration:
LDMIA sp!, {r0, lr} # Recover lr register (r0 is just there for
/* # the 8-byte stack alignment */
/* } */
__tx_timer_nothing_expired:
RET # Return to caller
.type _tx_timer_interrupt,$function
.size _tx_timer_interrupt,.-_tx_timer_interrupt
/* } */

View File

@@ -81,7 +81,7 @@ __tx_free_memory_start
;/* FUNCTION RELEASE */
;/* */
;/* _tx_initialize_low_level Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -114,7 +114,7 @@ __tx_free_memory_start
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_initialize_low_level(VOID)

View File

@@ -26,7 +26,7 @@
/* PORT SPECIFIC C INFORMATION RELEASE */
/* */
/* tx_port.h Cortex-A9/IAR */
/* 6.0.1 */
/* 6.1 */
/* */
/* AUTHOR */
/* */
@@ -47,7 +47,7 @@
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
/* */
/**************************************************************************/
@@ -382,7 +382,7 @@ void tx_thread_vfp_disable(void);
#ifdef TX_THREAD_INIT
CHAR _tx_version_id[] =
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/IAR Version 6.0 *";
"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/IAR Version 6.1 *";
#else
#ifdef TX_MISRA_ENABLE
extern CHAR _tx_version_id[100];

View File

@@ -534,7 +534,7 @@ For generic code revision information, please refer to the readme_threadx_generi
file, which is included in your distribution. The following details the revision
information associated with this specific port of ThreadX:
06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A9 using IAR's ARM tools.
09-30-2020 Initial ThreadX version 6.1 for Cortex-A9 using IAR's ARM tools.
Copyright(c) 1996-2020 Microsoft Corporation

View File

@@ -57,7 +57,7 @@ SVC_MODE_BITS DEFINE 0x13 ; SVC mode value
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_context_restore Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -89,7 +89,7 @@ SVC_MODE_BITS DEFINE 0x13 ; SVC mode value
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_context_restore(VOID)

View File

@@ -49,7 +49,7 @@ DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_context_save Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -80,7 +80,7 @@ DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_context_save(VOID)

View File

@@ -58,7 +58,7 @@ SVC_MODE_BITS DEFINE 0x13 ; SVC mode value
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_fiq_context_restore Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -90,7 +90,7 @@ SVC_MODE_BITS DEFINE 0x13 ; SVC mode value
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_fiq_context_restore(VOID)

View File

@@ -42,7 +42,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_fiq_context_save Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -73,7 +73,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
; VOID _tx_thread_fiq_context_save(VOID)

View File

@@ -44,7 +44,7 @@ FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_fiq_nesting_end Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -83,7 +83,7 @@ FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_fiq_nesting_end(VOID)

View File

@@ -41,7 +41,7 @@ SYS_MODE_BITS DEFINE 0x1F ; System mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_fiq_nesting_start Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -77,7 +77,7 @@ SYS_MODE_BITS DEFINE 0x1F ; System mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_fiq_nesting_start(VOID)

View File

@@ -41,7 +41,7 @@ INT_MASK DEFINE 0x80 ; Interrupt bit mask
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_interrupt_control Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -71,7 +71,7 @@ INT_MASK DEFINE 0x80 ; Interrupt bit mask
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;UINT _tx_thread_interrupt_control(UINT new_posture)

View File

@@ -42,7 +42,7 @@ DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_interrupt_disable Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -71,7 +71,7 @@ DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;UINT _tx_thread_interrupt_disable(VOID)

View File

@@ -34,7 +34,7 @@
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_interrupt_restore Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -64,7 +64,7 @@
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;void _tx_thread_interrupt_restore(UINT old_posture)

View File

@@ -45,7 +45,7 @@ IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_irq_nesting_end Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -84,7 +84,7 @@ IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_irq_nesting_end(VOID)

View File

@@ -41,7 +41,7 @@ SYS_MODE_BITS DEFINE 0x1F ; System mode bits
;/* FUNCTION RELEASE */
;/* */
;/* _tx_thread_irq_nesting_start Cortex-A9/IAR */
;/* 6.0.1 */
;/* 6.1 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
@@ -77,7 +77,7 @@ SYS_MODE_BITS DEFINE 0x1F ; System mode bits
;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_irq_nesting_start(VOID)

Some files were not shown because too many files have changed in this diff Show More