mirror of
https://github.com/eclipse-threadx/threadx.git
synced 2025-11-16 12:34:48 +00:00
6.1 minor release
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
12
ports/cortex_a9/green/example_build/azure_rtos_workspace.gpj
Normal file
12
ports/cortex_a9/green/example_build/azure_rtos_workspace.gpj
Normal 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
|
||||
45
ports/cortex_a9/green/example_build/reset.arm
Normal file
45
ports/cortex_a9/green/example_build/reset.arm
Normal 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
|
||||
369
ports/cortex_a9/green/example_build/sample_threadx.c
Normal file
369
ports/cortex_a9/green/example_build/sample_threadx.c
Normal 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;
|
||||
}
|
||||
}
|
||||
11
ports/cortex_a9/green/example_build/sample_threadx.con
Normal file
11
ports/cortex_a9/green/example_build/sample_threadx.con
Normal 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"
|
||||
11
ports/cortex_a9/green/example_build/sample_threadx.gpj
Normal file
11
ports/cortex_a9/green/example_build/sample_threadx.gpj
Normal 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
|
||||
44
ports/cortex_a9/green/example_build/sample_threadx.ld
Normal file
44
ports/cortex_a9/green/example_build/sample_threadx.ld
Normal 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) :
|
||||
}
|
||||
13
ports/cortex_a9/green/example_build/sample_threadx_el.gpj
Normal file
13
ports/cortex_a9/green/example_build/sample_threadx_el.gpj
Normal 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
|
||||
45
ports/cortex_a9/green/example_build/sample_threadx_el.ld
Normal file
45
ports/cortex_a9/green/example_build/sample_threadx_el.ld
Normal 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) :
|
||||
}
|
||||
283
ports/cortex_a9/green/example_build/tx.gpj
Normal file
283
ports/cortex_a9/green/example_build/tx.gpj
Normal 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
|
||||
319
ports/cortex_a9/green/example_build/tx_initialize_low_level.arm
Normal file
319
ports/cortex_a9/green/example_build/tx_initialize_low_level.arm
Normal 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
|
||||
284
ports/cortex_a9/green/example_build/txe.gpj
Normal file
284
ports/cortex_a9/green/example_build/txe.gpj
Normal 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
|
||||
402
ports/cortex_a9/green/inc/tx_port.h
Normal file
402
ports/cortex_a9/green/inc/tx_port.h
Normal 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
|
||||
|
||||
527
ports/cortex_a9/green/readme_threadx.txt
Normal file
527
ports/cortex_a9/green/readme_threadx.txt
Normal 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
|
||||
|
||||
259
ports/cortex_a9/green/src/tx_thread_context_restore.arm
Normal file
259
ports/cortex_a9/green/src/tx_thread_context_restore.arm
Normal 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
|
||||
|
||||
/* } */
|
||||
|
||||
207
ports/cortex_a9/green/src/tx_thread_context_save.arm
Normal file
207
ports/cortex_a9/green/src/tx_thread_context_save.arm
Normal 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
|
||||
|
||||
/* }
|
||||
} */
|
||||
|
||||
264
ports/cortex_a9/green/src/tx_thread_fiq_context_restore.arm
Normal file
264
ports/cortex_a9/green/src/tx_thread_fiq_context_restore.arm
Normal 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
|
||||
|
||||
/* } */
|
||||
|
||||
197
ports/cortex_a9/green/src/tx_thread_fiq_context_save.arm
Normal file
197
ports/cortex_a9/green/src/tx_thread_fiq_context_save.arm
Normal 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
|
||||
|
||||
/* }
|
||||
} */
|
||||
|
||||
109
ports/cortex_a9/green/src/tx_thread_fiq_nesting_end.arm
Normal file
109
ports/cortex_a9/green/src/tx_thread_fiq_nesting_end.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
103
ports/cortex_a9/green/src/tx_thread_fiq_nesting_start.arm
Normal file
103
ports/cortex_a9/green/src/tx_thread_fiq_nesting_start.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
101
ports/cortex_a9/green/src/tx_thread_interrupt_control.arm
Normal file
101
ports/cortex_a9/green/src/tx_thread_interrupt_control.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
|
||||
|
||||
105
ports/cortex_a9/green/src/tx_thread_interrupt_disable.arm
Normal file
105
ports/cortex_a9/green/src/tx_thread_interrupt_disable.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
85
ports/cortex_a9/green/src/tx_thread_interrupt_restore.arm
Normal file
85
ports/cortex_a9/green/src/tx_thread_interrupt_restore.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
109
ports/cortex_a9/green/src/tx_thread_irq_nesting_end.arm
Normal file
109
ports/cortex_a9/green/src/tx_thread_irq_nesting_end.arm
Normal 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
|
||||
|
||||
/* } */
|
||||
|
||||
102
ports/cortex_a9/green/src/tx_thread_irq_nesting_start.arm
Normal file
102
ports/cortex_a9/green/src/tx_thread_irq_nesting_start.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
254
ports/cortex_a9/green/src/tx_thread_schedule.arm
Normal file
254
ports/cortex_a9/green/src/tx_thread_schedule.arm
Normal 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
|
||||
|
||||
/* } */
|
||||
|
||||
|
||||
|
||||
161
ports/cortex_a9/green/src/tx_thread_stack_build.arm
Normal file
161
ports/cortex_a9/green/src/tx_thread_stack_build.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
167
ports/cortex_a9/green/src/tx_thread_system_return.arm
Normal file
167
ports/cortex_a9/green/src/tx_thread_system_return.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
196
ports/cortex_a9/green/src/tx_thread_vectored_context_save.arm
Normal file
196
ports/cortex_a9/green/src/tx_thread_vectored_context_save.arm
Normal 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
|
||||
|
||||
/* }
|
||||
} */
|
||||
|
||||
241
ports/cortex_a9/green/src/tx_timer_interrupt.arm
Normal file
241
ports/cortex_a9/green/src/tx_timer_interrupt.arm
Normal 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
|
||||
/* } */
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user