00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <coocox.h>
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 __asm U8 Inc8 (volatile U8 *data)
00033 {
00034 PUSH {R1}
00035 CPSID I
00036 LDRB R1,[R0]
00037 ADDS R1,#1
00038 STRB R1,[R0]
00039 CPSIE I
00040 SUBS R1,#1
00041 MOVS R0,R1
00042 POP {R1}
00043 BX LR
00044 ALIGN
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 __asm U8 Dec8 (volatile U8 *data)
00061 {
00062 PUSH {R1}
00063 CPSID I
00064 LDRB R1,[R0]
00065 SUBS R1,#1
00066 STRB R1,[R0]
00067 CPSIE I
00068 MOVS R0,R1
00069 POP {R1}
00070 BX LR
00071 ALIGN
00072 }
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 __asm void IRQ_ENABLE_RESTORE(void)
00086 { CPSIE I
00087 BX LR
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 __asm void IRQ_DISABLE_SAVE(void)
00102 { CPSID I
00103 BX LR
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 __asm void SetEnvironment(OS_STK *pstk)
00119 {
00120 SUBS R0,#28
00121 MSR PSP, R0 ; Mov new stack point to PSP
00122 BX LR
00123 ALIGN
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 __asm void SwitchContext(void)
00140 {
00141 LDR R0, =0xE000ED04 ; Trigger the PendSV exception (causes context switch)
00142 LDR R1, =0x10000000
00143 STR R1, [R0]
00144 BX LR
00145 ALIGN
00146 }
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 #if CFG_CHIP_TYPE == 2
00161 extern "C" __asm void PendSV_Handler()
00162 {
00163 IMPORT TCBRunning
00164 IMPORT TCBNext
00165 IMPORT OSSchedLock
00166 LDR R3,=TCBRunning
00167 LDR R1,[R3] ; R1 == running tcb
00168 LDR R2,=TCBNext
00169 LDR R2,[R2] ; R2 == next tcb
00170
00171 CMP R1,R2
00172 BEQ exitPendSV
00173 MRS R0, PSP ; Get PSP point (can not use PUSH,in ISR,SP is MSP )
00174
00175 SUBS R0,R0,#32
00176 STR R0,[R1] ; Save orig PSP
00177 ; Store r4-r11,r0 -= regCnt * 4,r0 is new stack
00178 ; top point (addr h->l r11,r10,...,r5,r4)
00179 STMIA R0!,{R4-R7} ; Save old context (R4-R7)
00180 MOV R4,R8
00181 MOV R5,R9
00182 MOV R6,R10
00183 MOV R7,R11
00184 STMIA R0!,{R4-R7} ; Save old context (R8-R11)
00185
00186
00187 popStk
00188 STR R2, [R3] ; TCBRunning = TCBNext ;
00189 LDR R0, [R2] ; Get SP of task that be switch into.
00190
00191 ADDS R0, R0,#16
00192 LDMIA R0!,{R4-R7} ; Restore new Context (R8-R11)
00193 MOV R8,R4
00194 MOV R9,R5
00195 MOV R10,R6
00196 MOV R11,R7
00197 SUBS R0,R0,#32
00198 LDMIA R0!,{R4-R7} ; Restore new Context (R4-R7)
00199 ADDS R0, R0,#16
00200 MSR PSP, R0 ; Mov new stack point to PSP
00201
00202 exitPendSV
00203 LDR R3,=OSSchedLock
00204 MOVS R0, #0x0
00205 STRB R0, [R3]
00206 MOVS R0,#4
00207 RSBS R0,#0 ; =0xFFFFFFFC,Ensure exception return uses process stack
00208 BX R0 ; Exit interrupt
00209 ALIGN
00210 }
00211 #endif
00212
00213
00214 #if CFG_CHIP_TYPE == 1
00215 extern "C" __asm void PendSV_Handler()
00216 {
00217 IMPORT TCBRunning
00218 IMPORT TCBNext
00219 IMPORT OSSchedLock
00220 LDR R3,=TCBRunning
00221 LDR R1,[R3] ; R1 == running tcb
00222 LDR R2,=TCBNext
00223 LDR R2,[R2] ; R2 == next tcb
00224
00225 CMP R1,R2
00226 BEQ exitPendSV
00227 MRS R0, PSP ; Get PSP point (can not use PUSH,in ISR,SP is MSP )
00228 STMDB R0!,{R4-R11} ; Store r4-r11,r0 -= regCnt * 4,r0 is new stack
00229 ; top point (addr h->l r11,r10,...,r5,r4)
00230 STR R0,[R1] ; Save orig PSP
00231 popStk
00232 STR R2, [R3] ; TCBRunning = TCBNext;
00233 LDR R0, [R2] ; Get SP of task that be switch into.
00234 LDMIA R0!,{R4-R11} ; POP (R4-R11),R0 += regCnt * 4
00235 MSR PSP, R0 ; Mov new stack point to PSP
00236
00237 exitPendSV
00238 LDR R3,=OSSchedLock
00239 MOVS R0, #0x0
00240 STRB R0, [R3]
00241 ORR LR, LR, #0x04 ; Ensure exception return uses process stack
00242 BX LR ; Exit interrupt
00243
00244 ALIGN
00245 }
00246 #endif
00247
00248