📄 bseppca.lst
字号:
00000000 00 1 #
00000000 00 2 # bseppca.s
00000000 00 3 #
00000000 00 4 # Barnett Systems Engineering
00000000 00 5 # MPC8xx PowerPC Specific Assembly Language Functions
00000000 00 6 # for UCOS-II
00000000 00 7 # Has only been checked with MPC8xx chips
00000000 00 8 # but should work with any 32-bit non-floating point PowerPC
00000000 00 9 #
00000000 00 10 # Functions:
00000000 00 11 # void OSStartHighRdy (void)
00000000 00 12 # void OSCtxSw (void)
00000000 00 13 # void OSIntCtxSw (void)
00000000 00 14 # void DECIntr (void)
00000000 00 15 #
00000000 00 16 # Author: Harry E. Barnett 11/11/99
00000000 00 17 # harryb@hbbse.com http://www.hbbse.com
00000000 00 18 #
00000000 00 19 # Version V1.00
00000000 00 20 #
00000000 00 21 #########################################################################
00000000 00 22 .list
00000000 00 23 .file "bseppca.s"
00000000 00 24 .title "UCOS-II MPC8xx Power PC Assembly Language Functions"
00000000 00 25
00000000 00 26 .global OSStartHighRdy
00000000 00 27 .global OSCtxSw
00000000 00 28 .global OSIntCtxSw
00000000 00 29 .global DECIntr
00000000 00 30 .global EIEIntr
00000000 00 31
00000000 00 32 .text
00000000 00 33 .align 2
00000000 00 34
00000000 00 35 .extern OSTCBHighRdy ;pointer to highest priority ready task
00000000 00 36 .extern OSTCBCur ;pointer to current tasks TCB
00000000 00 37 .extern OSTaskSwHook
00000000 00 38 .extern OSRunning
00000000 00 39
00000000 00 40 #########################################################################
00000000 00 41 # Stack Frame Definition
00000000 00 42 # These Stack frame definitions have to be congruent with the
00000000 00 43 # Stack Frame usage in bseppcc.c
00000000 00 44 #########################################################################
00000000 00 45 XR1 .equ 0
00000000 00 46 XBLK .equ XR1+4
00000000 00 47 XR0 .equ XBLK+4
00000000 00 48 XSRR0 .equ XR0+4
00000000 00 49 XSRR1 .equ XSRR0+4
00000000 00 50 XCTR .equ XSRR1+4
00000000 00 51 XXER .equ XCTR+4
00000000 00 52 XCR .equ XXER+4
00000000 00 53 XLR .equ XCR+4
00000000 00 54 XR2 .equ XLR+4
00000000 00 55 XR3 .equ XR2+4
00000000 00 56 XR4 .equ XR3+4
00000000 00 57 XR5 .equ XR4+4
00000000 00 58 XR6 .equ XR5+4
00000000 00 59 XR7 .equ XR6+4
00000000 00 60 XR8 .equ XR7+4
00000000 00 61 XR9 .equ XR8+4
00000000 00 62 XR10 .equ XR9+4
00000000 00 63 XR11 .equ XR10+4
00000000 00 64 XR12 .equ XR11+4
00000000 00 65 XR13 .equ XR12+4
00000000 00 66 XR14 .equ XR13+4
00000000 00 67 XR15 .equ XR14+4
00000000 00 68 XR16 .equ XR15+4
00000000 00 69 XR17 .equ XR16+4
00000000 00 70 XR18 .equ XR17+4
00000000 00 71 XR19 .equ XR18+4
00000000 00 72 XR20 .equ XR19+4
00000000 00 73 XR21 .equ XR20+4
00000000 00 74 XR22 .equ XR21+4
00000000 00 75 XR23 .equ XR22+4
00000000 00 76 XR24 .equ XR23+4
00000000 00 77 XR25 .equ XR24+4
00000000 00 78 XR26 .equ XR25+4
00000000 00 79 XR27 .equ XR26+4
00000000 00 80 XR28 .equ XR27+4
00000000 00 81 XR29 .equ XR28+4
00000000 00 82 XR30 .equ XR29+4
00000000 00 83 XR31 .equ XR30+4
00000000 00 84 XMSR .equ XR31+4
00000000 00 85 STACK_FRAME_SIZE .equ XMSR+4
00000000 00 86
00000000 00 87 #########################################################################
00000000 00 88 # Start multitasking
00000000 00 89 # void OSStartHighRdy(void)
00000000 00 90 #########################################################################
00000000 00 91
00000000 00 92 OSStartHighRdy:
00000000 00 93 # Call OSTaskSwHook
00000000 00 4800 0001 94 bl OSTaskSwHook
00000004 00 95
00000004 00 96 # Set OSRunning to 1
00000004 00 3800 0001 97 li r0,1
00000008 00 3d60 0000 98 lis r11,OSRunning@ha
0000000c 00 980b 0000 99 stb r0,OSRunning@l(r11)
00000010 00 100
00000010 00 101 # Get pointer to ready task TCB
00000010 00 3d60 0000 102 lis r11,OSTCBHighRdy@ha
00000014 00 816b 0000 103 lwz r11,OSTCBHighRdy@l(r11)
00000018 00 104
00000018 00 105 # Save as current task TCB ptr.
00000018 00 3d80 0000 106 lis r12,OSTCBCur@ha
0000001c 00 916c 0000 107 stw r11,OSTCBCur@l(r12)
00000020 00 108
00000020 00 109 # Get new stack pointer
00000020 00 802b 0000 110 lwz r1,0(r11)
00000024 00 111
00000024 00 112 # Restore context
00000024 00 8041 0024 113 lwz r2,XR2(r1)
00000028 00 8061 0028 114 lwz r3,XR3(r1)
0000002c 00 8081 002c 115 lwz r4,XR4(r1)
00000030 00 80a1 0030 116 lwz r5,XR5(r1)
00000034 00 80c1 0034 117 lwz r6,XR6(r1)
00000038 00 80e1 0038 118 lwz r7,XR7(r1)
0000003c 00 8101 003c 119 lwz r8,XR8(r1)
00000040 00 8121 0040 120 lwz r9,XR9(r1)
00000044 00 8141 0044 121 lwz r10,XR10(r1)
00000048 00 8161 0048 122 lwz r11,XR11(r1)
0000004c 00 8181 004c 123 lwz r12,XR12(r1)
00000050 00 81a1 0050 124 lwz r13,XR13(r1)
00000054 00 81c1 0054 125 lwz r14,XR14(r1)
00000058 00 81e1 0058 126 lwz r15,XR15(r1)
0000005c 00 8201 005c 127 lwz r16,XR16(r1)
00000060 00 8221 0060 128 lwz r17,XR17(r1)
00000064 00 8241 0064 129 lwz r18,XR18(r1)
00000068 00 8261 0068 130 lwz r19,XR19(r1)
0000006c 00 8281 006c 131 lwz r20,XR20(r1)
00000070 00 82a1 0070 132 lwz r21,XR21(r1)
00000074 00 82c1 0074 133 lwz r22,XR22(r1)
00000078 00 82e1 0078 134 lwz r23,XR23(r1)
0000007c 00 8301 007c 135 lwz r24,XR24(r1)
00000080 00 8321 0080 136 lwz r25,XR25(r1)
00000084 00 8341 0084 137 lwz r26,XR26(r1)
00000088 00 8361 0088 138 lwz r27,XR27(r1)
0000008c 00 8381 008c 139 lwz r28,XR28(r1)
00000090 00 83a1 0090 140 lwz r29,XR29(r1)
00000094 00 83c1 0094 141 lwz r30,XR30(r1)
00000098 00 83e1 0098 142 lwz r31,XR31(r1)
0000009c 00 8001 0020 143 lwz r0,XLR(r1)
000000a0 00 7c08 03a6 144 mtspr LR,r0
000000a4 00 8001 001c 145 lwz r0,XCR(r1)
000000a8 00 7c0f f120 146 mtcrf 255,r0
000000ac 00 8001 0018 147 lwz r0,XXER(r1)
000000b0 00 7c01 03a6 148 mtspr XER,r0
000000b4 00 8001 0014 149 lwz r0,XCTR(r1)
000000b8 00 7c09 03a6 150 mtspr CTR,r0
000000bc 00 8001 0010 151 lwz r0,XSRR1(r1)
000000c0 00 7c1b 03a6 152 mtspr SRR1,r0
000000c4 00 8001 000c 153 lwz r0,XSRR0(r1)
000000c8 00 7c1a 03a6 154 mtspr SRR0,r0
000000cc 00 155
000000cc 00 156 # srn 04.06.26
000000cc 00 157 # Finally, make r1 point to the bottom of this stack frame.
000000cc 00 158 # Restore action has been completed...
000000cc 00 159 # ...and we can use this new stack point since here.
000000cc 00 160 #
000000cc 00 161 # Yes, we did lose old MSR in the case of we needn't it!
000000cc 00 162 #
000000cc 00 163 #
000000cc 00 164 # Test: restore msr
000000cc 00 8001 009c 165 lwz r0,XMSR(r1)
000000d0 00 7c00 0124 166 mtmsr r0
000000d4 00 167 # End
000000d4 00 168
000000d4 00 8001 0008 169 lwz r0,XR0(r1)
000000d8 00 3821 00a0 170 addi r1,r1,STACK_FRAME_SIZE
000000dc 00 4c00 0064 171 rfi
000000e0 00 172
000000e0 00 173
000000e0 00 174 #########################################################################
000000e0 00 175 # Perform a context switch from task level
000000e0 00 176 # void OSCtxSw(void)
000000e0 00 177 #########################################################################
000000e0 00 178
000000e0 00 179 OSCtxSw:
000000e0 00 180 #Save context
000000e0 00 9421 ff60 181 stwu r1,-STACK_FRAME_SIZE(r1)
000000e4 00 9001 0008 182 stw r0,XR0(r1)
000000e8 00 7c00 00a6 183 mfmsr r0
000000ec 00 9001 009c 184 stw r0,XMSR(1) # srn 04.06.26 ???
000000f0 00 7c1a 02a6 185 mfspr r0,SRR0
000000f4 00 9001 000c 186 stw r0,XSRR0(r1)
000000f8 00 7c1b 02a6 187 mfspr r0,SRR1
000000fc 00 9001 0010 188 stw r0,XSRR1(r1)
00000100 00 7c09 02a6 189 mfspr r0,CTR
00000104 00 9001 0014 190 stw r0,XCTR(r1)
00000108 00 7c01 02a6 191 mfspr r0,XER
0000010c 00 9001 0018 192 stw r0,XXER(r1)
00000110 00 7c00 0026 193 mfcr r0
00000114 00 9001 001c 194 stw r0,XCR(r1)
00000118 00 7c08 02a6 195 mfspr r0,LR
0000011c 00 9001 0020 196 stw r0,XLR(r1)
00000120 00 9041 0024 197 stw r2,XR2(r1)
00000124 00 9061 0028 198 stw r3,XR3(r1)
00000128 00 9081 002c 199 stw r4,XR4(r1)
0000012c 00 90a1 0030 200 stw r5,XR5(r1)
00000130 00 90c1 0034 201 stw r6,XR6(r1)
00000134 00 90e1 0038 202 stw r7,XR7(r1)
00000138 00 9101 003c 203 stw r8,XR8(r1)
0000013c 00 9121 0040 204 stw r9,XR9(r1)
00000140 00 9141 0044 205 stw r10,XR10(r1)
00000144 00 9161 0048 206 stw r11,XR11(r1)
00000148 00 9181 004c 207 stw r12,XR12(r1)
0000014c 00 91a1 0050 208 stw r13,XR13(r1)
00000150 00 91c1 0054 209 stw r14,XR14(r1)
00000154 00 91e1 0058 210 stw r15,XR15(r1)
00000158 00 9201 005c 211 stw r16,XR16(r1)
0000015c 00 9221 0060 212 stw r17,XR17(r1)
00000160 00 9241 0064 213 stw r18,XR18(r1)
00000164 00 9261 0068 214 stw r19,XR19(r1)
00000168 00 9281 006c 215 stw r20,XR20(r1)
0000016c 00 92a1 0070 216 stw r21,XR21(r1)
00000170 00 92c1 0074 217 stw r22,XR22(r1)
00000174 00 92e1 0078 218 stw r23,XR23(r1)
00000178 00 9301 007c 219 stw r24,XR24(r1)
0000017c 00 9321 0080 220 stw r25,XR25(r1)
00000180 00 9341 0084 221 stw r26,XR26(r1)
00000184 00 9361 0088 222 stw r27,XR27(r1)
00000188 00 9381 008c 223 stw r28,XR28(r1)
0000018c 00 93a1 0090 224 stw r29,XR29(r1)
00000190 00 93c1 0094 225 stw r30,XR30(r1)
00000194 00 93e1 0098 226 stw r31,XR31(r1)
00000198 00 227
00000198 00 228 # Get pointer to current TCB
00000198 00 229 #
00000198 00 230 # srn 04.06.27
00000198 00 231 # 'OSTCBCur@ha' means the high 16 bits addr of OSTCBCur...
00000198 00 232 # ...not the value of OSTCBCur!
00000198 00 233 #
00000198 00 3d60 0000 234 lis r11,OSTCBCur@ha
0000019c 00 816b 0000 235 lwz r11,OSTCBCur@l(r11)
000001a0 00 236
000001a0 00 237 # Save stack pointer in current TCB
000001a0 00 902b 0000 238 stw r1,0(r11)
000001a4 00 239
000001a4 00 240 # Call OSTaskSwHook
000001a4 00 4800 0001 241 bl OSTaskSwHook
000001a8 00 242
000001a8 00 243 # Get pointer to ready task TCB
000001a8 00 3d60 0000 244 lis r11,OSTCBHighRdy@ha
000001ac 00 816b 0000 245 lwz r11,OSTCBHighRdy@l(r11)
000001b0 00 246
000001b0 00 247 # Save as current task TCB ptr.
000001b0 00 248 #
000001b0 00 249 # srn 04.06.26
000001b0 00 250 # Why not do this before the calling of OS_TASK_SW() ?
000001b0 00 251 #
000001b0 00 3d80 0000 252 lis r12,OSTCBCur@ha
000001b4 00 916c 0000 253 stw r11,OSTCBCur@l(r12)
000001b8 00 254
000001b8 00 255 # Get High Ready Priority
000001b8 00 3d80 0000 256 lis r12,OSPrioHighRdy@ha
000001bc 00 894c 0000 257 lbz r10,OSPrioHighRdy@l(r12)
000001c0 00 258
000001c0 00 259 # Save as Current Priority
000001c0 00 3d80 0000 260 lis r12,OSPrioCur@ha
000001c4 00 994c 0000 261 stb r10,OSPrioCur@l(r12)
000001c8 00 262
000001c8 00 263 # Get new stack pointer
000001c8 00 802b 0000 264 lwz r1,0(r11)
000001cc 00 265
000001cc 00 266 # Restore context
000001cc 00 8041 0024 267 lwz r2,XR2(r1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -