4 .extern vTaskSwitchContext
\r
5 .extern vTaskIncrementTick
\r
6 .extern vPortISRHandler
\r
8 .global vPortStartFirstTask
\r
10 .global vPortTickISR
\r
11 .global vPortISRWrapper
\r
14 .set NextLRField, BChainField + 4
\r
15 .set MSRField, NextLRField + 4
\r
16 .set PCField, MSRField + 4
\r
17 .set LRField, PCField + 4
\r
18 .set CTRField, LRField + 4
\r
19 .set XERField, CTRField + 4
\r
20 .set CRField, XERField + 4
\r
21 .set USPRG0Field, CRField + 4
\r
22 .set r0Field, USPRG0Field + 4
\r
23 .set r2Field, r0Field + 4
\r
24 .set r3r31Field, r2Field + 4
\r
25 .set IFrameSize, r3r31Field + ( ( 31 - 3 ) + 1 ) * 4
\r
28 .macro portSAVE_STACK_POINTER_AND_LR
\r
30 # Get the address of the TCB.
\r
32 addis R2, R0, pxCurrentTCB@ha
\r
33 lwz R2, pxCurrentTCB@l( R2 )
\r
35 # Store the stack pointer into the TCB
\r
38 # Save the link register
\r
47 .macro portRESTORE_STACK_POINTER_AND_LR
\r
49 # Restore the link register
\r
56 # Get the address of the TCB.
\r
58 addis SP, R0, pxCurrentTCB@ha
\r
59 lwz SP, pxCurrentTCB@l( R1 )
\r
61 # Get the task stack pointer from the TCB.
\r
67 vPortStartFirstTask:
\r
69 # Get the address of the TCB.
\r
71 addis SP, R0, pxCurrentTCB@ha
\r
72 lwz SP, pxCurrentTCB@l( SP )
\r
74 # Get the task stack pointer from the TCB.
\r
77 # Restore MSR register to SRR1.
\r
78 lwz R0, MSRField(R1)
\r
81 # Restore current PC location to SRR0.
\r
85 # Save USPRG0 register
\r
86 lwz R0, USPRG0Field(R1)
\r
89 # Restore Condition register
\r
93 # Restore Fixed Point Exception register
\r
94 lwz R0, XERField(R1)
\r
97 # Restore Counter register
\r
98 lwz R0, CTRField(R1)
\r
101 # Restore Link register
\r
102 lwz R0, LRField(R1)
\r
105 # Restore remaining GPR registers.
\r
106 lmw R3,r3r31Field(R1)
\r
108 # Restore r0 and r2.
\r
109 lwz R0, r0Field(R1)
\r
110 lwz R2, r2Field(R1)
\r
112 # Remove frame from stack
\r
113 addi R1,R1,IFrameSize
\r
115 # Return into the first task
\r
122 portSAVE_STACK_POINTER_AND_LR
\r
123 bl vTaskSwitchContext
\r
124 portRESTORE_STACK_POINTER_AND_LR
\r
129 portSAVE_STACK_POINTER_AND_LR
\r
130 bl vTaskIncrementTick
\r
131 #if configUSE_PREEMPTION == 1
\r
132 bl vTaskSwitchContext
\r
135 # Clear the interrupt
\r
139 portRESTORE_STACK_POINTER_AND_LR
\r
144 portSAVE_STACK_POINTER_AND_LR
\r
146 portRESTORE_STACK_POINTER_AND_LR
\r