📄 os_cpu_a.lis
字号:
00AA 0A93 ST -Y,R16
00AC 0EB7 IN R16,SPH
00AE 0A93 ST -Y,R16
00B0 0DB7 IN R16,SPL
00B2 0A93 ST -Y,R16
00B4
00B4 E0910000 LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
00B8 F0910100 LDS R31,_OSTCBCur+1 ;
00BC C193 ST Z+,R28 ; Save Y (R29:R28) pointer
00BE D193 ST Z+,R29 ;
00C0
00C0 0E940000 CALL _OSTaskSwHook ; Call user defined task switch hook
00C4
00C4 00910000 LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
00C8 00930000 STS _OSPrioCur,R16
00CC
00CC E0910000 LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
00D0 F0910100 LDS R31,_OSTCBHighRdy+1 ; ready to run
00D4 E0930000 STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
00D8 F0930100 STS _OSTCBCur+1,R31 ;
00DC
00DC C191 LD R28,Z+ ; Restore Y pointer
00DE D191 LD R29,Z+ ;
00E0
00E0 0991 LD R16,Y+
00E2 0DBF OUT SPL,R16
00E4 0991 LD R16,Y+
00E6 0EBF OUT SPH,R16
00E8 0991 LD R16,Y+
00EA 0FBF OUT SREG,R16
00EC 0991 LD R16,Y+
00EE 0BBF OUT RAMPZ,R16
00F0 F991 LD R31,Y+
00F2 E991 LD R30,Y+
00F4 B991 LD R27,Y+
00F6 A991 LD R26,Y+
00F8 9991 LD R25,Y+
00FA 8991 LD R24,Y+
00FC 7991 LD R23,Y+
00FE 6991 LD R22,Y+
0100 5991 LD R21,Y+
0102 4991 LD R20,Y+
0104 3991 LD R19,Y+
0106 2991 LD R18,Y+
0108 1991 LD R17,Y+
010A 0991 LD R16,Y+
010C F990 LD R15,Y+
010E E990 LD R14,Y+
0110 D990 LD R13,Y+
0112 C990 LD R12,Y+
0114 B990 LD R11,Y+
0116 A990 LD R10,Y+
0118 9990 LD R9,Y+
011A 8990 LD R8,Y+
011C 7990 LD R7,Y+
011E 6990 LD R6,Y+
0120 5990 LD R5,Y+
0122 4990 LD R4,Y+
0124 3990 LD R3,Y+
0126 2990 LD R2,Y+
0128 1990 LD R1,Y+
012A 0990 LD R0,Y+
012C 0895 RET
012E
012E
012E ;*******************************************************************************
012E ; INTERRUPT LEVEL CONTEXT SWITCH
012E ;
012E ; Description : This function is called by OSIntExit() to perform a context
012E ; switch to a task that has been made ready-to-run by an ISR.
012E ;
012E ; Note(s):
012E ; 1) Upon entry,
012E ; OSTCBCur points to the OS_TCB of the task to suspend
012E ; OSTCBHighRdy points to the OS_TCB of the task to resume
012E ;
012E ; 2) The stack frame of the task to suspend looks as follows:
012E ;
012E ; SP +0 --> LSB of return address of OSIntCtxSw() (Low memory)
012E ; +1 MSB of return address of OSIntCtxSw()
012E ; +2 LSB of return address of OSIntExit()
012E ; +3 MSB of return address of OSIntExit()
012E ; +4 LSB of task code address
012E ; +5 MSB of task code address (High memory)
012E ;
012E ; 3) The saved context of the task to resume looks as follows:
012E ;
012E ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low mem)
012E ; MSB of (return) stack pointer
012E ; Flags to load in status register
012E ; R31
012E ; R30
012E ; R7
012E ; .
012E ; .
012E ; .
012E ; R0 (High memory)
012E ;*******************************************************************************
012E
012E _OSIntCtxSw::
012E EDB7 IN R30,SPL ; Z = SP
0130 FEB7 IN R31,SPH
0132 ; ADIW R30,4 ; (Uncomment if OS_CRITICAL_METHOD is 1, see OS_CPU.H)
0132 3596 ADIW R30,5 ; Adjust Z to point to task return address
0134 FA93 ST -Y,R31 ; Save SP
0136 EA93 ST -Y,R30 ;
0138
0138 E0910000 LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
013C F0910100 LDS R31,_OSTCBCur+1 ;
0140 C193 ST Z+,R28 ; Save Y pointer
0142 D193 ST Z+,R29 ;
0144
0144 0E940000 CALL _OSTaskSwHook ; Call user defined task switch hook
0148
0148 00910000 LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
014C 00930000 STS _OSPrioCur,R16 ;
0150
0150 E0910000 LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
0154 F0910100 LDS R31,_OSTCBHighRdy+1 ;
0158 E0930000 STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
015C F0930100 STS _OSTCBCur+1,R31 ;
0160
0160 C191 LD R28,Z+ ; Restore Y pointer
0162 D191 LD R29,Z+ ;
0164 0991 LD R16,Y+
0166 0DBF OUT SPL,R16
0168 0991 LD R16,Y+
016A 0EBF OUT SPH,R16
016C 0991 LD R16,Y+
016E 0FBF OUT SREG,R16
0170 0991 LD R16,Y+
0172 0BBF OUT RAMPZ,R16
0174 F991 LD R31,Y+
0176 E991 LD R30,Y+
0178 B991 LD R27,Y+
017A A991 LD R26,Y+
017C 9991 LD R25,Y+
017E 8991 LD R24,Y+
0180 7991 LD R23,Y+
0182 6991 LD R22,Y+
0184 5991 LD R21,Y+
0186 4991 LD R20,Y+
0188 3991 LD R19,Y+
018A 2991 LD R18,Y+
018C 1991 LD R17,Y+
018E 0991 LD R16,Y+
0190 F990 LD R15,Y+
0192 E990 LD R14,Y+
0194 D990 LD R13,Y+
0196 C990 LD R12,Y+
0198 B990 LD R11,Y+
019A A990 LD R10,Y+
019C 9990 LD R9,Y+
019E 8990 LD R8,Y+
01A0 7990 LD R7,Y+
01A2 6990 LD R6,Y+
01A4 5990 LD R5,Y+
01A6 4990 LD R4,Y+
01A8 3990 LD R3,Y+
01AA 2990 LD R2,Y+
01AC 1990 LD R1,Y+
01AE 0990 LD R0,Y+
01B0 0895 RET
01B2
01B2 ;******************************************************************************
01B2 ; SYSTEM TICK ISR
01B2 ;
01B2 ; Description: This function is the ISR used to notify uC/OS-II that a system
01B2 ; tick has occurred.
01B2 ;
01B2 ;
01B2 ;*******************************************************************************
01B2 ;
01B2 _OSTickISR::
01B2 0A92 ST -Y,R0
01B4 1A92 ST -Y,R1
01B6 2A92 ST -Y,R2
01B8 3A92 ST -Y,R3
01BA 4A92 ST -Y,R4
01BC 5A92 ST -Y,R5
01BE 6A92 ST -Y,R6
01C0 7A92 ST -Y,R7
01C2 8A92 ST -Y,R8
01C4 9A92 ST -Y,R9
01C6 AA92 ST -Y,R10
01C8 BA92 ST -Y,R11
01CA CA92 ST -Y,R12
01CC DA92 ST -Y,R13
01CE EA92 ST -Y,R14
01D0 FA92 ST -Y,R15
01D2 0A93 ST -Y,R16
01D4 1A93 ST -Y,R17
01D6 2A93 ST -Y,R18
01D8 3A93 ST -Y,R19
01DA 4A93 ST -Y,R20
01DC 5A93 ST -Y,R21
01DE 6A93 ST -Y,R22
01E0 7A93 ST -Y,R23
01E2 8A93 ST -Y,R24
01E4 9A93 ST -Y,R25
01E6 AA93 ST -Y,R26
01E8 BA93 ST -Y,R27
01EA EA93 ST -Y,R30
01EC FA93 ST -Y,R31
01EE 0BB7 IN R16,RAMPZ
01F0 0A93 ST -Y,R16
01F2 0FB7 IN R16, SREG
01F4 0068 SBR R16, 0x80 ; bei Aufruf dieser ISR geloeschtes I-Flag setzen
01F6 0A93 ST -Y, R16
01F8
01F8 ; TimerCounter aufrischen
01F8 09ED LDI R16,256-(4000000/100/1024) ; Reload TC_2, 10ms bei 4MHz
01FA 04BD OUT TCNT2,R16
01FC
01FC 00910000 LDS R16,_OSIntNesting ; Notify uC/OS-II of ISR
0200 0395 INC R16 ;
0202 00930000 STS _OSIntNesting,R16 ;
0206
0206 0E940000 CALL _OSTimeTick ; Call uC/OS-II's tick updating function
020A ; bearbeitet die tasktimer, wenn 0 --> deren Prio in Aufruftab stellen
020A
020A 0E940000 CALL _OSIntExit ; Notify uC/OS-II about end of ISR
020E ; fuehrt gegebenfalls einen Context-Switch aus
020E
020E 0991 LD R16,Y+
0210 0FBF OUT SREG,R16
0212 0991 LD R16,Y+
0214 0BBF OUT RAMPZ,R16
0216 F991 LD R31,Y+
0218 E991 LD R30,Y+
021A B991 LD R27,Y+
021C A991 LD R26,Y+
021E 9991 LD R25,Y+
0220 8991 LD R24,Y+
0222 7991 LD R23,Y+
0224 6991 LD R22,Y+
0226 5991 LD R21,Y+
0228 4991 LD R20,Y+
022A 3991 LD R19,Y+
022C 2991 LD R18,Y+
022E 1991 LD R17,Y+
0230 0991 LD R16,Y+
0232 F990 LD R15,Y+
0234 E990 LD R14,Y+
0236 D990 LD R13,Y+
0238 C990 LD R12,Y+
023A B990 LD R11,Y+
023C A990 LD R10,Y+
023E 9990 LD R9,Y+
0240 8990 LD R8,Y+
0242 7990 LD R7,Y+
0244 6990 LD R6,Y+
0246 5990 LD R5,Y+
0248 4990 LD R4,Y+
024A 3990 LD R3,Y+
024C 2990 LD R2,Y+
024E 1990 LD R1,Y+
0250 0990 LD R0,Y+
0252 0895 RET ; Note: RET instead of RETI
0254
0254 ;*******************************************************************************
0254 ;
0254 ;*******************************************************************************
0254
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -