📄 os_cpu_a.lis
字号:
012C ; SPH of (return) stack pointer
012C ; Flags to load in status register
012C ; R31
012C ; R30
012C ; R27
012C ; .
012C ; .
012C ; R0
012C ; PCH
012C ; PCL (High memory)
012C ;*********************************************************************************************************
012C
012C _OSIntCtxSw::
012C 0E940000 CALL _OSTaskSwHook ; Call user defined task switch hook
0130
0130 00910000 LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
0134 00930000 STS _OSPrioCur,R16 ;
0138
0138 E0910000 LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
013C F0910100 LDS R31,_OSTCBHighRdy+1 ;
0140 E0930000 STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
0144 F0930100 STS _OSTCBCur+1,R31 ;
0148
0148 C191 LD R28,Z+ ; Restore Y pointer
014A D191 LD R29,Z+ ;
014C
014C 0991 LD R16,Y+
014E 0DBF OUT SPL,R16
0150 0991 LD R16,Y+
0152 0EBF OUT SPH,R16
0154 0991 LD R16,Y+
0156 0FBF OUT SREG,R16
0158 F991 LD R31,Y+
015A E991 LD R30,Y+
015C B991 LD R27,Y+
015E A991 LD R26,Y+
0160 9991 LD R25,Y+
0162 8991 LD R24,Y+
0164 7991 LD R23,Y+
0166 6991 LD R22,Y+
0168 5991 LD R21,Y+
016A 4991 LD R20,Y+
016C 3991 LD R19,Y+
016E 2991 LD R18,Y+
0170 1991 LD R17,Y+
0172 0991 LD R16,Y+
0174 F990 LD R15,Y+
0176 E990 LD R14,Y+
0178 D990 LD R13,Y+
017A C990 LD R12,Y+
017C B990 LD R11,Y+
017E A990 LD R10,Y+
0180 9990 LD R9,Y+
0182 8990 LD R8,Y+
0184 7990 LD R7,Y+
0186 6990 LD R6,Y+
0188 5990 LD R5,Y+
018A 4990 LD R4,Y+
018C 3990 LD R3,Y+
018E 2990 LD R2,Y+
0190 1990 LD R1,Y+
0192 0990 LD R0,Y+
0194 0895 RET
0196
0196 ;/*$PAGE*/.
0196 ;********************************************************************************************************
0196 ; SYSTEM TICK ISR
0196 ;
0196 ; Description : This function is the ISR used to notify uC/OS-II that a system tick has occurred.
0196 ;
0196 ; The following C-like pseudo-code describe the operation being performed in the code below.
0196 ;
0196 ; Save all registers on the current task's stack:
0196 ; Use the PUSH_ALL macro
0196 ; Get the SREG, set Bit #7 and save onto the task's stack using -Y addressing
0196 ; Use the PUSH_SP macro to save the task's hardware stack pointer onto the current task's stack
0196 ; OSIntNesting++;
0196 ; if (OSIntNesting == 1) {
0196 ; OSTCBCur->OSTCBStkPtr = SP
0196 ; }
0196 ; Clear the interrupt; Not needed for the timer we used.
0196 ; OSTimeTick(); Notify uC/OS-II that a tick has occured
0196 ; OSIntExit(); Notify uC/OS-II about end of ISR
0196 ; Restore all registers that were save on the current task's stack:
0196 ; Use the POP_SP macro to restore the task's hardware stack pointer
0196 ; Use the POP_SREG macro to restore the SREG register
0196 ; Use the POP_ALL macro to restore the remaining registers
0196 ; Return (DO NOT use a RETI instruction);
0196 ;********************************************************************************************************
0196
0196 _OSTickISR::
0196 0A92 ST -Y,R0
0198 1A92 ST -Y,R1
019A 2A92 ST -Y,R2
019C 3A92 ST -Y,R3
019E 4A92 ST -Y,R4
01A0 5A92 ST -Y,R5
01A2 6A92 ST -Y,R6
01A4 7A92 ST -Y,R7
01A6 8A92 ST -Y,R8
01A8 9A92 ST -Y,R9
01AA AA92 ST -Y,R10
01AC BA92 ST -Y,R11
01AE CA92 ST -Y,R12
01B0 DA92 ST -Y,R13
01B2 EA92 ST -Y,R14
01B4 FA92 ST -Y,R15
01B6 0A93 ST -Y,R16
01B8 1A93 ST -Y,R17
01BA 2A93 ST -Y,R18
01BC 3A93 ST -Y,R19
01BE 4A93 ST -Y,R20
01C0 5A93 ST -Y,R21
01C2 6A93 ST -Y,R22
01C4 7A93 ST -Y,R23
01C6 8A93 ST -Y,R24
01C8 9A93 ST -Y,R25
01CA AA93 ST -Y,R26
01CC BA93 ST -Y,R27
01CE EA93 ST -Y,R30
01D0 FA93 ST -Y,R31
01D2 0FB7 IN R16,SREG ; Save the SREG but with interrupts enabled
01D4 0068 SBR R16,BIT07
01D6 0A93 ST -Y,R16
01D8 0EB7 IN R16,SPH
01DA 0A93 ST -Y,R16
01DC 0DB7 IN R16,SPL
01DE 0A93 ST -Y,R16
01E0
01E0 00910000 LDS R16,_OSIntNesting ; Notify uC/OS-II of ISR
01E4 0395 INC R16 ;
01E6 00930000 STS _OSIntNesting,R16 ;
01EA
01EA 0130 CPI R16,1 ; if (OSIntNesting == 1) {
01EC 31F4 BRNE OSTickISR_1
01EE
01EE E0910000 LDS R30,_OSTCBCur ; OSTCBCur->OSTCBStkPtr = Y
01F2 F0910100 LDS R31,_OSTCBCur+1
01F6 C193 ST Z+,R28
01F8 D193 ST Z+,R29 ; }
01FA
01FA OSTickISR_1:
01FA 0E940000 CALL _OSTickISR_Handler ; Handle the tick ISR
01FE
01FE 0E940000 CALL _OSIntExit ; Notify uC/OS-II about end of ISR
0202
0202 0991 LD R16,Y+
0204 0DBF OUT SPL,R16
0206 0991 LD R16,Y+
0208 0EBF OUT SPH,R16
020A 0991 LD R16,Y+
020C 0FBF OUT SREG,R16
020E F991 LD R31,Y+
0210 E991 LD R30,Y+
0212 B991 LD R27,Y+
0214 A991 LD R26,Y+
0216 9991 LD R25,Y+
0218 8991 LD R24,Y+
021A 7991 LD R23,Y+
021C 6991 LD R22,Y+
021E 5991 LD R21,Y+
0220 4991 LD R20,Y+
0222 3991 LD R19,Y+
0224 2991 LD R18,Y+
0226 1991 LD R17,Y+
0228 0991 LD R16,Y+
022A F990 LD R15,Y+
022C E990 LD R14,Y+
022E D990 LD R13,Y+
0230 C990 LD R12,Y+
0232 B990 LD R11,Y+
0234 A990 LD R10,Y+
0236 9990 LD R9,Y+
0238 8990 LD R8,Y+
023A 7990 LD R7,Y+
023C 6990 LD R6,Y+
023E 5990 LD R5,Y+
0240 4990 LD R4,Y+
0242 3990 LD R3,Y+
0244 2990 LD R2,Y+
0246 1990 LD R1,Y+
0248 0990 LD R0,Y+
024A
024A 0895 RET ; Note: RET instead of RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -