📄 os_cpu_a.lis
字号:
007C 6A92 ST -Y,R6
007E 7A92 ST -Y,R7
0080 8A92 ST -Y,R8
0082 9A92 ST -Y,R9
0084 AA92 ST -Y,R10
0086 BA92 ST -Y,R11
0088 CA92 ST -Y,R12
008A DA92 ST -Y,R13
008C EA92 ST -Y,R14
008E FA92 ST -Y,R15
0090 0A93 ST -Y,R16
0092 1A93 ST -Y,R17
0094 2A93 ST -Y,R18
0096 3A93 ST -Y,R19
0098 4A93 ST -Y,R20
009A 5A93 ST -Y,R21
009C 6A93 ST -Y,R22
009E 7A93 ST -Y,R23
00A0 8A93 ST -Y,R24
00A2 9A93 ST -Y,R25
00A4 AA93 ST -Y,R26
00A6 BA93 ST -Y,R27
00A8 EA93 ST -Y,R30
00AA FA93 ST -Y,R31
00AC 0FB7 IN R16,SREG
00AE 0A93 ST -Y,R16
00B0 0EB7 IN R16,SPH
00B2 0A93 ST -Y,R16
00B4 0DB7 IN R16,SPL
00B6 0A93 ST -Y,R16
00B8
00B8 E0910000 LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
00BC F0910100 LDS R31,_OSTCBCur+1 ;
00C0 C193 ST Z+,R28 ; Save Y (R29:R28) pointer
00C2 D193 ST Z+,R29 ;
00C4
00C4 0E940000 CALL _OSTaskSwHook ; Call user defined task switch hook
00C8
00C8 00910000 LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
00CC 00930000 STS _OSPrioCur,R16
00D0
00D0 E0910000 LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
00D4 F0910100 LDS R31,_OSTCBHighRdy+1 ; ready to run
00D8 E0930000 STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
00DC F0930100 STS _OSTCBCur+1,R31 ;
00E0
00E0 C191 LD R28,Z+ ; Restore Y pointer
00E2 D191 LD R29,Z+ ;
00E4
00E4 0991 LD R16,Y+
00E6 0DBF OUT SPL,R16
00E8 0991 LD R16,Y+
00EA 0EBF OUT SPH,R16
00EC 0991 LD R16,Y+ ;restores status register
00EE 07FD SBRC R16,7 ;SKip next instruction in interrupt disabled
00F0 20C0 RJMP OSCtxSw_1
00F2
00F2 0FBF OUT SREG,R16 ;Interrupts of task to return to are disabled
00F4 F991 LD R31,Y+
00F6 E991 LD R30,Y+
00F8 B991 LD R27,Y+
00FA A991 LD R26,Y+
00FC 9991 LD R25,Y+
00FE 8991 LD R24,Y+
0100 7991 LD R23,Y+
0102 6991 LD R22,Y+
0104 5991 LD R21,Y+
0106 4991 LD R20,Y+
0108 3991 LD R19,Y+
010A 2991 LD R18,Y+
010C 1991 LD R17,Y+
010E 0991 LD R16,Y+
0110 F990 LD R15,Y+
0112 E990 LD R14,Y+
0114 D990 LD R13,Y+
0116 C990 LD R12,Y+
0118 B990 LD R11,Y+
011A A990 LD R10,Y+
011C 9990 LD R9,Y+
011E 8990 LD R8,Y+
0120 7990 LD R7,Y+
0122 6990 LD R6,Y+
0124 5990 LD R5,Y+
0126 4990 LD R4,Y+
0128 3990 LD R3,Y+
012A 2990 LD R2,Y+
012C 1990 LD R1,Y+
012E 0990 LD R0,Y+
0130 0895 RET ;
0132 OSCtxSw_1:
0132 0F77 CBR R16,BIT07 ;Interrupts of task to return to are enabled
0134 0FBF OUT SREG,R16
0136 F991 LD R31,Y+
0138 E991 LD R30,Y+
013A B991 LD R27,Y+
013C A991 LD R26,Y+
013E 9991 LD R25,Y+
0140 8991 LD R24,Y+
0142 7991 LD R23,Y+
0144 6991 LD R22,Y+
0146 5991 LD R21,Y+
0148 4991 LD R20,Y+
014A 3991 LD R19,Y+
014C 2991 LD R18,Y+
014E 1991 LD R17,Y+
0150 0991 LD R16,Y+
0152 F990 LD R15,Y+
0154 E990 LD R14,Y+
0156 D990 LD R13,Y+
0158 C990 LD R12,Y+
015A B990 LD R11,Y+
015C A990 LD R10,Y+
015E 9990 LD R9,Y+
0160 8990 LD R8,Y+
0162 7990 LD R7,Y+
0164 6990 LD R6,Y+
0166 5990 LD R5,Y+
0168 4990 LD R4,Y+
016A 3990 LD R3,Y+
016C 2990 LD R2,Y+
016E 1990 LD R1,Y+
0170 0990 LD R0,Y+
0172 1895 RETI ;return form interrupt and enable interrupts
0174
0174
0174 ;*******************************************************************************
0174 ; INTERRUPT LEVEL CONTEXT SWITCH
0174 ;
0174 ; Description : This function is called by OSIntExit() to perform a context
0174 ; switch to a task that has been made ready-to-run by an ISR.
0174 ;
0174 ; Note(s):
0174 ; 1) Upon entry,
0174 ; OSTCBCur points to the OS_TCB of the task to suspend
0174 ; OSTCBHighRdy points to the OS_TCB of the task to resume
0174 ;
0174 ; 2) The stack frame of the task to suspend looks as follows:
0174 ;
0174 ; SP +0 --> LSB of return address of OSIntCtxSw() (Low memory)
0174 ; +1 MSB of return address of OSIntCtxSw()
0174 ; +2 LSB of return address of OSIntExit()
0174 ; +3 MSB of return address of OSIntExit()
0174 ; +4 LSB of task code address
0174 ; +5 MSB of task code address (High memory)
0174 ;
0174 ; 3) The saved context of the task to resume looks as follows:
0174 ;
0174 ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low mem)
0174 ; MSB of (return) stack pointer
0174 ; Flags to load in status register
0174 ; R31
0174 ; R30
0174 ; R7
0174 ; .
0174 ; .
0174 ; .
0174 ; R0 (High memory)
0174 ;*******************************************************************************
0174
0174 _OSIntCtxSw::
0174 ; IN R30,SPL ; Z = SP
0174 ; IN R31,SPH
0174 ; ADIW R30,4 ; (Uncomment if OS_CRITICAL_METHOD is 1, see OS_CPU.H)
0174 ; ADIW R30,5 ; Adjust Z to point to task return address
0174 ; ST -Y,R31 ; Save SP
0174 ; ST -Y,R30 ;
0174
0174 ; LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
0174 ; LDS R31,_OSTCBCur+1 ;
0174 ; ST Z+,R28 ; Save Y pointer
0174 ; ST Z+,R29 ;
0174
0174 0E940000 CALL _OSTaskSwHook ; Call user defined task switch hook
0178
0178 00910000 LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
017C 00930000 STS _OSPrioCur,R16 ;
0180
0180 E0910000 LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
0184 F0910100 LDS R31,_OSTCBHighRdy+1 ;
0188 E0930000 STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
018C F0930100 STS _OSTCBCur+1,R31 ;
0190
0190 C191 LD R28,Z+ ; Restore Y pointer
0192 D191 LD R29,Z+ ;
0194 0991 LD R16,Y+
0196 0DBF OUT SPL,R16
0198 0991 LD R16,Y+
019A 0EBF OUT SPH,R16
019C 0991 LD R16,Y+ ; restore stuatus register
019E 07FD SBRC R16,7
01A0 20C0 RJMP OSIntCtxSw_1
01A2
01A2 0FBF OUT SREG,R16 ; restore SREG
01A4 F991 LD R31,Y+
01A6 E991 LD R30,Y+
01A8 B991 LD R27,Y+
01AA A991 LD R26,Y+
01AC 9991 LD R25,Y+
01AE 8991 LD R24,Y+
01B0 7991 LD R23,Y+
01B2 6991 LD R22,Y+
01B4 5991 LD R21,Y+
01B6 4991 LD R20,Y+
01B8 3991 LD R19,Y+
01BA 2991 LD R18,Y+
01BC 1991 LD R17,Y+
01BE 0991 LD R16,Y+
01C0 F990 LD R15,Y+
01C2 E990 LD R14,Y+
01C4 D990 LD R13,Y+
01C6 C990 LD R12,Y+
01C8 B990 LD R11,Y+
01CA A990 LD R10,Y+
01CC 9990 LD R9,Y+
01CE 8990 LD R8,Y+
01D0 7990 LD R7,Y+
01D2 6990 LD R6,Y+
01D4 5990 LD R5,Y+
01D6 4990 LD R4,Y+
01D8 3990 LD R3,Y+
01DA 2990 LD R2,Y+
01DC 1990 LD R1,Y+
01DE 0990 LD R0,Y+
01E0 0895 RET
01E2 OSIntCtxSw_1:
01E2 0F77 CBR R16,BIT07;
01E4 0FBF OUT SREG,R16
01E6 F991 LD R31,Y+
01E8 E991 LD R30,Y+
01EA B991 LD R27,Y+
01EC A991 LD R26,Y+
01EE 9991 LD R25,Y+
01F0 8991 LD R24,Y+
01F2 7991 LD R23,Y+
01F4 6991 LD R22,Y+
01F6 5991 LD R21,Y+
01F8 4991 LD R20,Y+
01FA 3991 LD R19,Y+
01FC 2991 LD R18,Y+
01FE 1991 LD R17,Y+
0200 0991 LD R16,Y+
0202 F990 LD R15,Y+
0204 E990 LD R14,Y+
0206 D990 LD R13,Y+
0208 C990 LD R12,Y+
020A B990 LD R11,Y+
020C A990 LD R10,Y+
020E 9990 LD R9,Y+
0210 8990 LD R8,Y+
0212 7990 LD R7,Y+
0214 6990 LD R6,Y+
0216 5990 LD R5,Y+
0218 4990 LD R4,Y+
021A 3990 LD R3,Y+
021C 2990 LD R2,Y+
021E 1990 LD R1,Y+
0220 0990 LD R0,Y+
0222 1895 RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -