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