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