Tim Exton-McGuinness
/
round-robin-rtos
Round robin Scheduler
Diff: rtos.s
- Revision:
- 0:cf2d4c337b6f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rtos.s Thu Sep 09 14:09:14 2010 +0000 @@ -0,0 +1,53 @@ + AREA |.text|, CODE, READONLY + + +;------------------------------------------------------------------- +itask PROC + EXPORT itask + stmfd sp!,{r1,r2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,lr} + + mov r2,sp ;save this stack pointer + mov sp,r0 ;load new task stack pointer + mov lr,r1 ;load link address (start of task) + + stmfd sp!,{r1,r2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,lr} + mov r0,r13 ;return new stack pointer + + mov sp,r2 ;restore real stack pointer + + ldmfd sp!,{r1,r2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,lr} + + bx lr + ENDP + align + +;------------------------------------------------------------- +sleep_task PROC + EXPORT sleep_task ;r0=savesp r1=*tasksp + stmfd sp!,{r1,r2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,lr} + + str sp,[r1] ;save this stack pointer + mov sp,r0 ;load new task stack pointer + + ldmfd sp!,{r1,r2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,lr} + + bx lr + ENDP + align + +;------------------------------------------------------------- +run_task PROC + EXPORT run_task ;r0=*savesp r1=newsp + + stmfd sp!,{r1,r2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,lr} + + str sp,[r0] ;save this stack pointer + mov sp,r1 ;load new task stack pointer + + ldmfd sp!,{r1,r2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,lr} + + bx lr + ENDP + align + + END \ No newline at end of file