mirror of
https://github.com/kelvinlawson/atomthreads.git
synced 2026-01-19 14:23:15 +01:00
Please enter the commit message for your changes. Lines starting
This commit is contained in:
@@ -83,6 +83,7 @@ thread_shell (void)
|
||||
void
|
||||
archThreadContextInit (ATOM_TCB *tcb_ptr, void *stack_top, void (*entry_point)(uint32_t), uint32_t entry_param)
|
||||
{
|
||||
static uint32_t context_thread_id = 0 ;
|
||||
uint32_t * stack_ptr ;
|
||||
|
||||
tcb_ptr->sp_save_ptr = stack_top;
|
||||
@@ -91,7 +92,7 @@ archThreadContextInit (ATOM_TCB *tcb_ptr, void *stack_top, void (*entry_point)(u
|
||||
|
||||
stack_ptr = (uint32_t *)stack_top; //-- Load stack pointer
|
||||
|
||||
*stack_ptr = ( uint32_t ) entry ;
|
||||
*stack_ptr = ( uint32_t ) thread_shell ;
|
||||
stack_ptr--;
|
||||
|
||||
*stack_ptr = ( uint32_t ) 0x00001111; /* R11 */
|
||||
@@ -166,5 +167,20 @@ archTickHandler (void)
|
||||
atomIntExit(TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* \b archTickInit
|
||||
*
|
||||
* System timer initialization.
|
||||
*
|
||||
*/
|
||||
void
|
||||
archTickInit (void)
|
||||
{
|
||||
/* Initialize NVIC PendSV */
|
||||
contextInit () ;
|
||||
|
||||
/* Initializa Timer Hardware */
|
||||
/* ... */
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -37,10 +37,9 @@
|
||||
EXPORT contextEnableInterrupts
|
||||
EXPORT contextEnterCritical
|
||||
EXPORT contextExitCritical
|
||||
EXPORT __irq_context_handler
|
||||
EXPORT archIRQHandler
|
||||
|
||||
|
||||
EXTERN archTickHandler
|
||||
EXTERN __context_preempt_handler [WEAK]
|
||||
|
||||
;--
|
||||
ARM_SVC_MODE EQU 0xd3
|
||||
@@ -49,9 +48,7 @@ ARM_FIQ_MODE EQU 0xD1
|
||||
ARM_MODE_MASK EQU 0x1F
|
||||
ARM_FIQ_MODE_BITS EQU 0x11
|
||||
ARM_IRQ_MODE_BITS EQU 0x12
|
||||
ARM_SVC_MODE_BITS EQU 0x13
|
||||
|
||||
CONTEXT_SWITCH_MODE EQU ARM_SVC_MODE
|
||||
|
||||
ARM
|
||||
|
||||
@@ -85,19 +82,19 @@ contextSwitch
|
||||
STMFD sp!, {r4 - r11, lr} ;- Save registers
|
||||
|
||||
;- IF :DEF:CONTEXT_THREAD_ID
|
||||
MRC p15,0,r3,c13,c0,2
|
||||
MRC p15, 0, r3, c13, c0, 2
|
||||
STMFD sp!, {r3}
|
||||
;- ENDIF
|
||||
|
||||
STR sp, [r0] ;- Save old stack pointer
|
||||
LDR r1, [r1]
|
||||
MOV sp, r1 ;- Load new stack pointer
|
||||
LDR r1, [r1] ;- Load new stack pointer
|
||||
MOV sp, r1
|
||||
|
||||
ISB
|
||||
|
||||
;- IF :DEF:CONTEXT_THREAD_ID
|
||||
LDMFD sp!, {r3}
|
||||
MCR p15,0,r3,c13,c0,2
|
||||
MCR p15, 0, r3, c13, c0, 2
|
||||
;- ENDIF
|
||||
|
||||
LDMFD sp!, {r4 - r11, pc} ;- Load new registers
|
||||
@@ -113,11 +110,11 @@ contextSwitch
|
||||
;
|
||||
contextStart
|
||||
LDR r0, [r0]
|
||||
MOV sp, r0 ;- Load new stack pointer
|
||||
MOV sp, r0 ;- Load new stack pointer
|
||||
|
||||
;- IF :DEF:CONTEXT_THREAD_ID
|
||||
LDMFD sp!, {r3}
|
||||
MCR p15,0,r3,c13,c0,2
|
||||
MCR p15, 0, r3, c13, c0, 2
|
||||
;- ENDIF
|
||||
|
||||
LDMFD sp!, {r4 - r11, pc} ;- Load new registers
|
||||
@@ -130,7 +127,7 @@ contextStart
|
||||
; @return ID
|
||||
;
|
||||
contextId
|
||||
MRC p15,0,r0,c13,c0,2
|
||||
MRC p15, 0, r0, c13, c0, 2
|
||||
BX lr
|
||||
|
||||
;--
|
||||
@@ -141,12 +138,11 @@ contextId
|
||||
; @return None
|
||||
;
|
||||
contextEnableInterrupts
|
||||
MRS r0,CPSR
|
||||
MRS r0, CPSR
|
||||
MOV r1, #0x80
|
||||
BIC r0,r0,r1
|
||||
MSR CPSR_c,r0
|
||||
BX lr
|
||||
|
||||
BIC r0, r0, r1
|
||||
MSR CPSR_c, r0
|
||||
BX lr
|
||||
|
||||
;--
|
||||
; \b contextExitCritical
|
||||
@@ -158,9 +154,8 @@ contextEnableInterrupts
|
||||
; @return None
|
||||
;
|
||||
contextExitCritical
|
||||
MSR CPSR_cxsf,r0
|
||||
BX lr
|
||||
|
||||
MSR CPSR_cxsf, r0
|
||||
BX lr
|
||||
|
||||
;--
|
||||
; \b contextEnterCritical
|
||||
@@ -170,42 +165,45 @@ contextExitCritical
|
||||
; @return Current interrupt posture
|
||||
;
|
||||
contextEnterCritical
|
||||
MRS r0,CPSR
|
||||
ORR r1,r0,#0x80
|
||||
MSR CPSR_cxsf,r1
|
||||
MRS r0, CPSR
|
||||
ORR r1, r0, #0x80
|
||||
MSR CPSR_cxsf, r1
|
||||
BX lr
|
||||
|
||||
;--
|
||||
; \b __irq_context_handler
|
||||
; \b archIRQHandler
|
||||
;
|
||||
; IRQ entry point
|
||||
; IRQ entry point.
|
||||
;
|
||||
; Save the process/thread context onto its own stackm before calling __context_preempt_handler ().
|
||||
; __context_preempt_handler() might switch stacks. On return the same context is poped from the
|
||||
; stack and control is returned to the process.
|
||||
;
|
||||
; @return None
|
||||
;
|
||||
__irq_context_handler
|
||||
archIRQHandler
|
||||
|
||||
MSR cpsr_c, #CONTEXT_SWITCH_MODE ;- Save current process context
|
||||
MSR cpsr_c, #ARM_SVC_MODE ;- Save current process context in process stack
|
||||
STMFD sp!, {r0 - r3, ip, lr}
|
||||
|
||||
MSR cpsr_c, #ARM_IRQ_MODE ;- Save lr_irq and spsr_irq in process stack
|
||||
SUB lr,lr,#4
|
||||
SUB lr, lr, #4
|
||||
MOV r1, lr
|
||||
MRS r2, spsr
|
||||
MSR cpsr_c, #CONTEXT_SWITCH_MODE
|
||||
MSR cpsr_c, #ARM_SVC_MODE
|
||||
STMFD sp!, {r1, r2}
|
||||
|
||||
BL __context_preempt_handler ;- Dispatch the interrupt to archTickHandler for the timer tick interrupt or a simular function for other interrupts which might call atomthread functions.
|
||||
BL __context_preempt_handler ;- Dispatch the interrupt to archTickHandler for the timer tick interrupt or a simular function for other interrupts which might call atomthread functions.
|
||||
|
||||
LDMFD sp!, {r1, r2} ;- Restore lr_irq and spsr_irq from process stack
|
||||
MSR cpsr_c, #ARM_IRQ_MODE
|
||||
STMFD sp!, {r1}
|
||||
MSR spsr_cxsf, r2
|
||||
|
||||
MSR cpsr_c, #CONTEXT_SWITCH_MODE ;- Restore process regs
|
||||
MSR cpsr_c, #ARM_SVC_MODE ;- Restore process regs
|
||||
LDMFD sp!, {r0 - r3, ip, lr}
|
||||
|
||||
MSR cpsr_c, #ARM_IRQ_MODE ;- Exit from ISR
|
||||
|
||||
MSR cpsr_c, #ARM_IRQ_MODE ;- Exit from IRQ
|
||||
LDMFD sp!, {pc}^
|
||||
|
||||
|
||||
|
||||
@@ -33,5 +33,7 @@
|
||||
|
||||
/* Function prototypes */
|
||||
extern void archTickHandler (void) ;
|
||||
extern void archTickInit (void) ;
|
||||
extern void archIRQHandler (void) ;
|
||||
|
||||
#endif /* __ATOM_PORT_PRIVATE_H__ */
|
||||
|
||||
@@ -94,7 +94,7 @@ archThreadContextInit (ATOM_TCB *tcb_ptr, void *stack_top, void (*entry_point)(u
|
||||
|
||||
*stack_ptr = 0x01000000L; //-- xPSR
|
||||
stack_ptr--;
|
||||
*stack_ptr = ((uint32_t)entry_point) | 1; //-- Entry Point (1 for THUMB mode)
|
||||
*stack_ptr = ((uint32_t)thread_shell) | 1; //-- Entry Point (1 for THUMB mode)
|
||||
stack_ptr--;
|
||||
*stack_ptr = ((uint32_t)/*exit*/0) | 1; //-- R14 (LR) (1 for THUMB mode)
|
||||
stack_ptr--;
|
||||
|
||||
Reference in New Issue
Block a user