git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@6922 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
b4ebba0b50
commit
dd4f3da00e
|
@ -40,90 +40,100 @@
|
||||||
|
|
||||||
#if !defined(__DOXYGEN__)
|
#if !defined(__DOXYGEN__)
|
||||||
|
|
||||||
MODULE ?chcoreasm_v6m
|
MODULE ?chcoreasm_v6m
|
||||||
|
|
||||||
AAPCS INTERWORK, VFP_COMPATIBLE
|
AAPCS INTERWORK, VFP_COMPATIBLE
|
||||||
PRESERVE8
|
PRESERVE8
|
||||||
|
|
||||||
CONTEXT_OFFSET SET 12
|
CONTEXT_OFFSET SET 12
|
||||||
SCB_ICSR SET 0xE000ED04
|
SCB_ICSR SET 0xE000ED04
|
||||||
|
|
||||||
SECTION .text:CODE:NOROOT(2)
|
SECTION .text:CODE:NOROOT(2)
|
||||||
|
|
||||||
EXTERN chThdExit
|
EXTERN chThdExit
|
||||||
EXTERN chSchDoReschedule
|
EXTERN chSchDoReschedule
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
EXTERN _stats_start_measure_crit_thd
|
||||||
|
EXTERN _stats_stop_measure_crit_thd
|
||||||
|
#endif
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
EXTERN dbg_check_unlock
|
EXTERN _dbg_check_unlock
|
||||||
EXTERN dbg_check_lock
|
EXTERN _dbg_check_lock
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
THUMB
|
THUMB
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Performs a context switch between two threads.
|
* Performs a context switch between two threads.
|
||||||
*/
|
*/
|
||||||
PUBLIC _port_switch
|
PUBLIC _port_switch
|
||||||
_port_switch:
|
_port_switch:
|
||||||
push {r4, r5, r6, r7, lr}
|
push {r4, r5, r6, r7, lr}
|
||||||
mov r4, r8
|
mov r4, r8
|
||||||
mov r5, r9
|
mov r5, r9
|
||||||
mov r6, r10
|
mov r6, r10
|
||||||
mov r7, r11
|
mov r7, r11
|
||||||
push {r4, r5, r6, r7}
|
push {r4, r5, r6, r7}
|
||||||
mov r3, sp
|
mov r3, sp
|
||||||
str r3, [r1, #CONTEXT_OFFSET]
|
str r3, [r1, #CONTEXT_OFFSET]
|
||||||
ldr r3, [r0, #CONTEXT_OFFSET]
|
ldr r3, [r0, #CONTEXT_OFFSET]
|
||||||
mov sp, r3
|
mov sp, r3
|
||||||
pop {r4, r5, r6, r7}
|
pop {r4, r5, r6, r7}
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
mov r9, r5
|
mov r9, r5
|
||||||
mov r10, r6
|
mov r10, r6
|
||||||
mov r11, r7
|
mov r11, r7
|
||||||
pop {r4, r5, r6, r7, pc}
|
pop {r4, r5, r6, r7, pc}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start a thread by invoking its work function.
|
* Start a thread by invoking its work function.
|
||||||
* If the work function returns @p chThdExit() is automatically invoked.
|
* If the work function returns @p chThdExit() is automatically invoked.
|
||||||
*/
|
*/
|
||||||
PUBLIC _port_thread_start
|
PUBLIC _port_thread_start
|
||||||
_port_thread_start:
|
_port_thread_start:
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_unlock
|
||||||
#endif
|
#endif
|
||||||
cpsie i
|
cpsie i
|
||||||
mov r0, r5
|
mov r0, r5
|
||||||
blx r4
|
blx r4
|
||||||
bl chThdExit
|
bl chThdExit
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Post-IRQ switch code.
|
* Post-IRQ switch code.
|
||||||
* Exception handlers return here for context switching.
|
* Exception handlers return here for context switching.
|
||||||
*/
|
*/
|
||||||
PUBLIC _port_switch_from_isr
|
PUBLIC _port_switch_from_isr
|
||||||
PUBLIC _port_exit_from_isr
|
PUBLIC _port_exit_from_isr
|
||||||
_port_switch_from_isr:
|
_port_switch_from_isr:
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_STATISTICS
|
||||||
bl dbg_check_lock
|
bl _stats_start_measure_crit_thd
|
||||||
#endif
|
#endif
|
||||||
bl chSchDoReschedule
|
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_lock
|
||||||
|
#endif
|
||||||
|
bl chSchDoReschedule
|
||||||
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
|
bl _dbg_check_unlock
|
||||||
|
#endif
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
bl _stats_stop_measure_crit_thd
|
||||||
#endif
|
#endif
|
||||||
_port_exit_from_isr:
|
_port_exit_from_isr:
|
||||||
ldr r2, =SCB_ICSR
|
ldr r2, =SCB_ICSR
|
||||||
movs r3, #128
|
movs r3, #128
|
||||||
#if CORTEX_ALTERNATE_SWITCH
|
#if CORTEX_ALTERNATE_SWITCH
|
||||||
lsls r3, r3, #21
|
lsls r3, r3, #21
|
||||||
str r3, [r2, #0]
|
str r3, [r2, #0]
|
||||||
cpsie i
|
cpsie i
|
||||||
#else
|
#else
|
||||||
lsls r3, r3, #24
|
lsls r3, r3, #24
|
||||||
str r3, [r2, #0]
|
str r3, [r2, #0]
|
||||||
#endif
|
#endif
|
||||||
waithere:
|
waithere:
|
||||||
b waithere
|
b waithere
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
||||||
#endif /* !defined(__DOXYGEN__) */
|
#endif /* !defined(__DOXYGEN__) */
|
||||||
|
|
||||||
|
|
|
@ -40,88 +40,98 @@
|
||||||
|
|
||||||
#if !defined(__DOXYGEN__)
|
#if !defined(__DOXYGEN__)
|
||||||
|
|
||||||
MODULE ?chcoreasm_v7m
|
MODULE ?chcoreasm_v7m
|
||||||
|
|
||||||
AAPCS INTERWORK, VFP_COMPATIBLE
|
AAPCS INTERWORK, VFP_COMPATIBLE
|
||||||
PRESERVE8
|
PRESERVE8
|
||||||
|
|
||||||
CONTEXT_OFFSET SET 12
|
CONTEXT_OFFSET SET 12
|
||||||
SCB_ICSR SET 0xE000ED04
|
SCB_ICSR SET 0xE000ED04
|
||||||
ICSR_PENDSVSET SET 0x10000000
|
ICSR_PENDSVSET SET 0x10000000
|
||||||
|
|
||||||
SECTION .text:CODE:NOROOT(2)
|
SECTION .text:CODE:NOROOT(2)
|
||||||
|
|
||||||
EXTERN chThdExit
|
EXTERN chThdExit
|
||||||
EXTERN chSchDoReschedule
|
EXTERN chSchDoReschedule
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
EXTERN _stats_start_measure_crit_thd
|
||||||
|
EXTERN _stats_stop_measure_crit_thd
|
||||||
|
#endif
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
EXTERN dbg_check_unlock
|
EXTERN _dbg_check_unlock
|
||||||
EXTERN dbg_check_lock
|
EXTERN _dbg_check_lock
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
THUMB
|
THUMB
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Performs a context switch between two threads.
|
* Performs a context switch between two threads.
|
||||||
*/
|
*/
|
||||||
PUBLIC _port_switch
|
PUBLIC _port_switch
|
||||||
_port_switch:
|
_port_switch:
|
||||||
push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
||||||
#if CORTEX_USE_FPU
|
#if CORTEX_USE_FPU
|
||||||
vpush {s16-s31}
|
vpush {s16-s31}
|
||||||
#endif
|
#endif
|
||||||
str sp, [r1, #CONTEXT_OFFSET]
|
str sp, [r1, #CONTEXT_OFFSET]
|
||||||
ldr sp, [r0, #CONTEXT_OFFSET]
|
ldr sp, [r0, #CONTEXT_OFFSET]
|
||||||
#if CORTEX_USE_FPU
|
#if CORTEX_USE_FPU
|
||||||
vpop {s16-s31}
|
vpop {s16-s31}
|
||||||
#endif
|
#endif
|
||||||
pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
|
pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start a thread by invoking its work function.
|
* Start a thread by invoking its work function.
|
||||||
* If the work function returns @p chThdExit() is automatically invoked.
|
* If the work function returns @p chThdExit() is automatically invoked.
|
||||||
*/
|
*/
|
||||||
PUBLIC _port_thread_start
|
PUBLIC _port_thread_start
|
||||||
_port_thread_start:
|
_port_thread_start:
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_unlock
|
||||||
#endif
|
#endif
|
||||||
#if CORTEX_SIMPLIFIED_PRIORITY
|
#if CORTEX_SIMPLIFIED_PRIORITY
|
||||||
cpsie i
|
cpsie i
|
||||||
#else
|
#else
|
||||||
movs r3, #CORTEX_BASEPRI_DISABLED
|
movs r3, #CORTEX_BASEPRI_DISABLED
|
||||||
msr BASEPRI, r3
|
msr BASEPRI, r3
|
||||||
#endif
|
#endif
|
||||||
mov r0, r5
|
mov r0, r5
|
||||||
blx r4
|
blx r4
|
||||||
bl chThdExit
|
bl chThdExit
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Post-IRQ switch code.
|
* Post-IRQ switch code.
|
||||||
* Exception handlers return here for context switching.
|
* Exception handlers return here for context switching.
|
||||||
*/
|
*/
|
||||||
PUBLIC _port_switch_from_isr
|
PUBLIC _port_switch_from_isr
|
||||||
PUBLIC _port_exit_from_isr
|
PUBLIC _port_exit_from_isr
|
||||||
_port_switch_from_isr:
|
_port_switch_from_isr:
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_STATISTICS
|
||||||
bl dbg_check_lock
|
bl _stats_start_measure_crit_thd
|
||||||
#endif
|
#endif
|
||||||
bl chSchDoReschedule
|
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_lock
|
||||||
|
#endif
|
||||||
|
bl chSchDoReschedule
|
||||||
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
|
bl _dbg_check_unlock
|
||||||
|
#endif
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
bl _stats_stop_measure_crit_thd
|
||||||
#endif
|
#endif
|
||||||
_port_exit_from_isr:
|
_port_exit_from_isr:
|
||||||
#if CORTEX_SIMPLIFIED_PRIORITY
|
#if CORTEX_SIMPLIFIED_PRIORITY
|
||||||
mov r3, #LWRD SCB_ICSR
|
mov r3, #LWRD SCB_ICSR
|
||||||
movt r3, #HWRD SCB_ICSR
|
movt r3, #HWRD SCB_ICSR
|
||||||
mov r2, #ICSR_PENDSVSET
|
mov r2, #ICSR_PENDSVSET
|
||||||
str r2, [r3]
|
str r2, [r3]
|
||||||
cpsie i
|
cpsie i
|
||||||
.L3: b .L3
|
|
||||||
#else
|
#else
|
||||||
svc #0
|
svc #0
|
||||||
#endif
|
#endif
|
||||||
|
.L3: b .L3
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
||||||
#endif /* !defined(__DOXYGEN__) */
|
#endif /* !defined(__DOXYGEN__) */
|
||||||
|
|
||||||
|
|
|
@ -49,9 +49,13 @@ SCB_ICSR EQU 0xE000ED04
|
||||||
|
|
||||||
IMPORT chThdExit
|
IMPORT chThdExit
|
||||||
IMPORT chSchDoReschedule
|
IMPORT chSchDoReschedule
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
IMPORT _stats_start_measure_crit_thd
|
||||||
|
IMPORT _stats_stop_measure_crit_thd
|
||||||
|
#endif
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
IMPORT dbg_check_unlock
|
IMPORT _dbg_check_unlock
|
||||||
IMPORT dbg_check_lock
|
IMPORT _dbg_check_lock
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -84,7 +88,7 @@ _port_switch PROC
|
||||||
EXPORT _port_thread_start
|
EXPORT _port_thread_start
|
||||||
_port_thread_start PROC
|
_port_thread_start PROC
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_unlock
|
||||||
#endif
|
#endif
|
||||||
cpsie i
|
cpsie i
|
||||||
mov r0, r5
|
mov r0, r5
|
||||||
|
@ -99,12 +103,18 @@ _port_thread_start PROC
|
||||||
EXPORT _port_switch_from_isr
|
EXPORT _port_switch_from_isr
|
||||||
EXPORT _port_exit_from_isr
|
EXPORT _port_exit_from_isr
|
||||||
_port_switch_from_isr PROC
|
_port_switch_from_isr PROC
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
bl _stats_start_measure_crit_thd
|
||||||
|
#endif
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_lock
|
bl _dbg_check_lock
|
||||||
#endif
|
#endif
|
||||||
bl chSchDoReschedule
|
bl chSchDoReschedule
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_unlock
|
||||||
|
#endif
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
bl _stats_stop_measure_crit_thd
|
||||||
#endif
|
#endif
|
||||||
_port_exit_from_isr
|
_port_exit_from_isr
|
||||||
ldr r2, =SCB_ICSR
|
ldr r2, =SCB_ICSR
|
||||||
|
|
|
@ -50,9 +50,13 @@ ICSR_PENDSVSET EQU 0x10000000
|
||||||
|
|
||||||
IMPORT chThdExit
|
IMPORT chThdExit
|
||||||
IMPORT chSchDoReschedule
|
IMPORT chSchDoReschedule
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
IMPORT _stats_start_measure_crit_thd
|
||||||
|
IMPORT _stats_stop_measure_crit_thd
|
||||||
|
#endif
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
IMPORT dbg_check_unlock
|
IMPORT _dbg_check_unlock
|
||||||
IMPORT dbg_check_lock
|
IMPORT _dbg_check_lock
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -79,7 +83,7 @@ _port_switch PROC
|
||||||
EXPORT _port_thread_start
|
EXPORT _port_thread_start
|
||||||
_port_thread_start PROC
|
_port_thread_start PROC
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_unlock
|
||||||
#endif
|
#endif
|
||||||
#if CORTEX_SIMPLIFIED_PRIORITY
|
#if CORTEX_SIMPLIFIED_PRIORITY
|
||||||
cpsie i
|
cpsie i
|
||||||
|
@ -99,12 +103,18 @@ _port_thread_start PROC
|
||||||
EXPORT _port_switch_from_isr
|
EXPORT _port_switch_from_isr
|
||||||
EXPORT _port_exit_from_isr
|
EXPORT _port_exit_from_isr
|
||||||
_port_switch_from_isr PROC
|
_port_switch_from_isr PROC
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
bl _stats_start_measure_crit_thd
|
||||||
|
#endif
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_lock
|
bl _dbg_check_lock
|
||||||
#endif
|
#endif
|
||||||
bl chSchDoReschedule
|
bl chSchDoReschedule
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_unlock
|
||||||
|
#endif
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
bl _stats_stop_measure_crit_thd
|
||||||
#endif
|
#endif
|
||||||
_port_exit_from_isr
|
_port_exit_from_isr
|
||||||
#if CORTEX_SIMPLIFIED_PRIORITY
|
#if CORTEX_SIMPLIFIED_PRIORITY
|
||||||
|
@ -113,10 +123,10 @@ _port_exit_from_isr
|
||||||
mov r2, #ICSR_PENDSVSET
|
mov r2, #ICSR_PENDSVSET
|
||||||
str r2, [r3, #0]
|
str r2, [r3, #0]
|
||||||
cpsie i
|
cpsie i
|
||||||
waithere b waithere
|
|
||||||
#else
|
#else
|
||||||
svc #0
|
svc #0
|
||||||
#endif
|
#endif
|
||||||
|
waithere b waithere
|
||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
|
@ -105,14 +105,14 @@ _IVOR10:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_enter_isr
|
bl _dbg_check_enter_isr
|
||||||
bl dbg_check_lock_from_isr
|
bl _dbg_check_lock_from_isr
|
||||||
#endif
|
#endif
|
||||||
/* System tick handler invocation.*/
|
/* System tick handler invocation.*/
|
||||||
bl chSysTimerHandlerI
|
bl chSysTimerHandlerI
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock_from_isr
|
bl _dbg_check_unlock_from_isr
|
||||||
bl dbg_check_leave_isr
|
bl _dbg_check_leave_isr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if PPC_USE_IRQ_PREEMPTION
|
#if PPC_USE_IRQ_PREEMPTION
|
||||||
|
@ -202,8 +202,11 @@ _ivor_exit:
|
||||||
eaddi %r0, %r0, -1
|
eaddi %r0, %r0, -1
|
||||||
mtspr 272, %r0
|
mtspr 272, %r0
|
||||||
|
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
bl _stats_start_measure_crit_thd
|
||||||
|
#endif
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_lock
|
bl _dbg_check_lock
|
||||||
#endif
|
#endif
|
||||||
bl chSchIsPreemptionRequired
|
bl chSchIsPreemptionRequired
|
||||||
cmpli cr0, %r3, 0
|
cmpli cr0, %r3, 0
|
||||||
|
@ -211,7 +214,10 @@ _ivor_exit:
|
||||||
bl chSchDoReschedule
|
bl chSchDoReschedule
|
||||||
.noresch:
|
.noresch:
|
||||||
#if CH_DBG_SYSTEM_STATE_CHECK
|
#if CH_DBG_SYSTEM_STATE_CHECK
|
||||||
bl dbg_check_unlock
|
bl _dbg_check_unlock
|
||||||
|
#endif
|
||||||
|
#if CH_DBG_STATISTICS
|
||||||
|
bl _stats_stop_measure_crit_thd
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Restoring the external context.*/
|
/* Restoring the external context.*/
|
||||||
|
|
Loading…
Reference in New Issue