git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@6922 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2014-05-07 14:38:02 +00:00
parent b4ebba0b50
commit dd4f3da00e
5 changed files with 148 additions and 102 deletions

View File

@ -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__) */

View File

@ -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__) */

View File

@ -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

View File

@ -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

View File

@ -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.*/