Please enter the commit message for your changes. Lines starting

This commit is contained in:
Natie van Rooyen
2012-05-17 23:42:58 +02:00
parent 5cc1e9831d
commit 113f0a8690
4 changed files with 51 additions and 35 deletions

View File

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

View File

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

View File

@@ -33,5 +33,7 @@
/* Function prototypes */
extern void archTickHandler (void) ;
extern void archTickInit (void) ;
extern void archIRQHandler (void) ;
#endif /* __ATOM_PORT_PRIVATE_H__ */

View File

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