AREA Sched,CODE,READWRITE EXTERN PROC0 EXTERN PROC1 EXTERN INITPROT EXTERN INITIRQ EXTERN INITTIMER EXTERN INITIRQ EXTERN INITVECTORS EXPORT NXTPROC ENTRY ;code entry point main ;program protection unit through CP15 ; BL INITPROT ;program interrupt controller and timer1 as irq source BL INITTIMER ;install interrupt handler BL INITVECTORS BL INITIRQ ;enable interrupts & switch to user mode MRS r0, CPSR BIC r0, r0, #0x9F MSR SPSR_c, r0 ADR r13, PCB0 LDMIA r13, {pc}^ ;process swap code - called from interrupt handler to swap process NXTPROC ;save process SUB r14, r14, #4 ;calculate return address from IRQ STR r14, r14tmp ;save r14 return address in tmp store LDR r13, RUNNING ADR r14, PROCTAB LDR r14, [r14,r13,lsl #2] ;r14->pcb LDR r13, r14tmp ;retrieve r14_irq STR r13, [r14], #4 ;save user prog return address MRS r13, SPSR ;r13=SPSR STR r13, [r14], #4 ;save user CPSR STMIA r14, {r0-r14}^ ;store user registers NOP ;noop after force user ;select process LDR r13, RUNNING ;retrieve current process id EOR r13, r13, #1 ;change process STR r13, RUNNING ;write new process id ;restore process ADR r14, PROCTAB LDR r13, [r14,r13,lsl #2] LDR r14, [r13,#4]! ;retrieve saved cpsr MSR SPSR_fsxc, r14 ;spsr=saved cpsr LDMIB r13, {r0-r14}^ ;restore user regs NOP ;noop after force user LDMDB r13, {pc}^ ;restore CPSR and pc RUNNING DCD 0 PROCTAB DCD PCB0 DCD PCB1 r14tmp DCD 0 ;process control block for process 0 PCB0 DCD PROC0 ;restart address DCD 0 ;cpsr % 60 ;r0-r14 ;process control block for process 1 PCB1 DCD PROC1 ;restart address DCD 0 ;cpsr % 60 ;r0-r14 IRQSTACK % 0x100 TOPIRQSTK END