📄 pjhost.lst
字号:
03F4 926A ST R6,-Y
03F5 927A ST R7,-Y
03F6 928A ST R8,-Y
03F7 929A ST R9,-Y
03F8 92AA ST R10,-Y
03F9 92BA ST R11,-Y
03FA 92CA ST R12,-Y
03FB 92DA ST R13,-Y
03FC 92EA ST R14,-Y
03FD 92FA ST R15,-Y
03FE 930A ST R16,-Y
03FF 931A ST R17,-Y
0400 932A ST R18,-Y
0401 933A ST R19,-Y
0402 934A ST R20,-Y
0403 935A ST R21,-Y
0404 936A ST R22,-Y
0405 937A ST R23,-Y
0406 938A ST R24,-Y
0407 939A ST R25,-Y
0408 93AA ST R26,-Y
0409 93BA ST R27,-Y
040A 93EA ST R30,-Y
040B 93FA ST R31,-Y
040C B70B IN R16,0x3B
(0200)
(0201) ;/*$PAGE*/.
(0202) ;********************************************************************************************************
(0203) ; TASK LEVEL CONTEXT SWITCH
(0204) ;
(0205) ; Description : This function is called when a task makes a higher priority task ready-to-run.
(0206) ;
(0207) ; Note(s) : 1) Upon entry,
(0208) ; OSTCBCur points to the OS_TCB of the task to suspend
(0209) ; OSTCBHighRdy points to the OS_TCB of the task to resume
(0210) ;
(0211) ; 2) The stack frame of the task to suspend looks as follows:
(0212) ;
(0213) ; SP+0 --> LSB of task code address
(0214) ; +1 MSB of task code address (High memory)
(0215) ;
(0216) ; 3) The saved context of the task to resume looks as follows:
(0217) ;
(0218) ; OSTCBHighRdy->OSTCBStkPtr --> SPL of (return) stack pointer (Low memory)
(0219) ; SPH of (return) stack pointer
(0220) ; Flags to load in status register
(0221) ; R31
(0222) ; R30
(0223) ; R27
(0224) ; .
(0225) ; .
(0226) ; R0
(0227) ; PCH
(0228) ; PCL (High memory)
(0229) ;********************************************************************************************************
(0230)
(0231) _OSCtxSw::
(0232) PUSH_ALL ; Save current task's context
040D 930A ST R16,-Y
040E B70F IN R16,0x3F
(0233) PUSH_SREG
040F 930A ST R16,-Y
0410 B70E IN R16,0x3E
0411 930A ST R16,-Y
0412 B70D IN R16,0x3D
(0234) PUSH_SP
0413 930A ST R16,-Y
(0235)
(0236) LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
0414 91E00807 LDS R30,OSTCBCur
(0237) LDS R31,_OSTCBCur+1 ;
0416 91F00808 LDS R31,OSTCBCur+1
(0238) ST Z+,R28 ; Save Y (R29:R28) pointer
0418 93C1 ST R28,Z+
(0239) ST Z+,R29 ;
0419 93D1 ST R29,Z+
(0240)
(0241) CALL _OSTaskSwHook ; Call user defined task switch hook
041A 940E1225 CALL _OSTaskSwHook
(0242)
(0243) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
041C 91000913 LDS R16,OSPrioHighRdy
(0244) STS _OSPrioCur,R16
041E 93000914 STS OSPrioCur,R16
(0245)
(0246) LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
0420 91E00803 LDS R30,OSTCBHighRdy
(0247) LDS R31,_OSTCBHighRdy+1 ; ready to run
0422 91F00804 LDS R31,OSTCBHighRdy+1
(0248) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
0424 93E00807 STS OSTCBCur,R30
(0249) STS _OSTCBCur+1,R31 ;
0426 93F00808 STS OSTCBCur+1,R31
(0250)
(0251) LD R28,Z+ ; Restore Y pointer
0428 91C1 LD R28,Z+
(0252) LD R29,Z+ ;
0429 91D1 LD R29,Z+
042A 9109 LD R16,Y+
042B BF0D OUT 0x3D,R16
042C 9109 LD R16,Y+
(0253)
(0254) POP_SP ; Restore stack pointer
042D BF0E OUT 0x3E,R16
042E 9109 LD R16,Y+
(0255) POP_SREG ; Restore status register
042F BF0F OUT 0x3F,R16
0430 9109 LD R16,Y+
0431 BF0B OUT 0x3B,R16
0432 91F9 LD R31,Y+
0433 91E9 LD R30,Y+
0434 91B9 LD R27,Y+
0435 91A9 LD R26,Y+
0436 9199 LD R25,Y+
0437 9189 LD R24,Y+
0438 9179 LD R23,Y+
0439 9169 LD R22,Y+
043A 9159 LD R21,Y+
043B 9149 LD R20,Y+
043C 9139 LD R19,Y+
043D 9129 LD R18,Y+
043E 9119 LD R17,Y+
043F 9109 LD R16,Y+
0440 90F9 LD R15,Y+
0441 90E9 LD R14,Y+
0442 90D9 LD R13,Y+
0443 90C9 LD R12,Y+
0444 90B9 LD R11,Y+
0445 90A9 LD R10,Y+
0446 9099 LD R9,Y+
0447 9089 LD R8,Y+
0448 9079 LD R7,Y+
0449 9069 LD R6,Y+
044A 9059 LD R5,Y+
044B 9049 LD R4,Y+
044C 9039 LD R3,Y+
044D 9029 LD R2,Y+
044E 9019 LD R1,Y+
(0256) POP_ALL ; Restore all registers
044F 9009 LD R0,Y+
(0257)
(0258) RET
0450 9508 RET
(0259)
(0260) ;/*$PAGE*/.
(0261) ;*********************************************************************************************************
(0262) ; INTERRUPT LEVEL CONTEXT SWITCH
(0263) ;
(0264) ; Description : This function is called by OSIntExit() to perform a context switch to a task that has
(0265) ; been made ready-to-run by an ISR.
(0266) ;
(0267) ; Note(s) : 1) Upon entry,
(0268) ; OSTCBCur points to the OS_TCB of the task to suspend
(0269) ; OSTCBHighRdy points to the OS_TCB of the task to resume
(0270) ;
(0271) ; 2) The stack frame of the task to suspend looks as follows:
(0272) ;
(0273) ; OSTCBCur->OSTCBStkPtr ------> SPL of (return) stack pointer (Low memory)
(0274) ; SPH of (return) stack pointer
(0275) ; Flags to load in status register
(0276) ; R31
(0277) ; R30
(0278) ; R27
(0279) ; .
(0280) ; .
(0281) ; R0
(0282) ; PCH
(0283) ; PCL (High memory)
(0284) ;
(0285) ; 3) The saved context of the task to resume looks as follows:
(0286) ;
(0287) ; OSTCBHighRdy->OSTCBStkPtr --> SPL of (return) stack pointer (Low memory)
(0288) ; SPH of (return) stack pointer
(0289) ; Flags to load in status register
(0290) ; R31
(0291) ; R30
(0292) ; R27
(0293) ; .
(0294) ; .
(0295) ; R0
(0296) ; PCH
(0297) ; PCL (High memory)
(0298) ;*********************************************************************************************************
(0299)
(0300) _OSIntCtxSw::
(0301) CALL _OSTaskSwHook ; Call user defined task switch hook
_OSIntCtxSw:
0451 940E1225 CALL _OSTaskSwHook
(0302)
(0303) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
0453 91000913 LDS R16,OSPrioHighRdy
(0304) STS _OSPrioCur,R16 ;
0455 93000914 STS OSPrioCur,R16
(0305)
(0306) LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
0457 91E00803 LDS R30,OSTCBHighRdy
(0307) LDS R31,_OSTCBHighRdy+1 ;
0459 91F00804 LDS R31,OSTCBHighRdy+1
(0308) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
045B 93E00807 STS OSTCBCur,R30
(0309) STS _OSTCBCur+1,R31 ;
045D 93F00808 STS OSTCBCur+1,R31
(0310)
(0311) LD R28,Z+ ; Restore Y pointer
045F 91C1 LD R28,Z+
(0312) LD R29,Z+ ;
0460 91D1 LD R29,Z+
0461 9109 LD R16,Y+
0462 BF0D OUT 0x3D,R16
0463 9109 LD R16,Y+
(0313)
(0314) POP_SP ; Restore stack pointer
0464 BF0E OUT 0x3E,R16
0465 9109 LD R16,Y+
(0315) POP_SREG ; Restore status register
0466 BF0F OUT 0x3F,R16
0467 9109 LD R16,Y+
0468 BF0B OUT 0x3B,R16
0469 91F9 LD R31,Y+
046A 91E9 LD R30,Y+
046B 91B9 LD R27,Y+
046C 91A9 LD R26,Y+
046D 9199 LD R25,Y+
046E 9189 LD R24,Y+
046F 9179 LD R23,Y+
0470 9169 LD R22,Y+
0471 9159 LD R21,Y+
0472 9149 LD R20,Y+
0473 9139 LD R19,Y+
0474 9129 LD R18,Y+
0475 9119 LD R17,Y+
0476 9109 LD R16,Y+
0477 90F9 LD R15,Y+
0478 90E9 LD R14,Y+
0479 90D9 LD R13,Y+
047A 90C9 LD R12,Y+
047B 90B9 LD R11,Y+
047C 90A9 LD R10,Y+
047D 9099 LD R9,Y+
047E 9089 LD R8,Y+
047F 9079 LD R7,Y+
0480 9069 LD R6,Y+
0481 9059 LD R5,Y+
0482 9049 LD R4,Y+
0483 9039 LD R3,Y+
0484 9029 LD R2,Y+
0485 9019 LD R1,Y+
(0316) POP_ALL ; Restore all registers
0486 9009 LD R0,Y+
(0317) RET
0487 9508 RET
_OSTickISR:
0488 920A ST R0,-Y
0489 921A ST R1,-Y
048A 922A ST R2,-Y
048B 923A ST R3,-Y
048C 924A ST R4,-Y
048D 925A ST R5,-Y
048E 926A ST R6,-Y
048F 927A ST R7,-Y
0490 928A ST R8,-Y
0491 929A ST R9,-Y
0492 92AA ST R10,-Y
0493 92BA ST R11,-Y
0494 92CA ST R12,-Y
0495 92DA ST R13,-Y
0496 92EA ST R14,-Y
0497 92FA ST R15,-Y
0498 930A ST R16,-Y
0499 931A ST R17,-Y
049A 932A ST R18,-Y
049B 933A ST R19,-Y
049C 934A ST R20,-Y
049D 935A ST R21,-Y
049E 936A ST R22,-Y
049F 937A ST R23,-Y
04A0 938A ST R24,-Y
04A1 939A ST R25,-Y
04A2 93AA ST R26,-Y
04A3 93BA ST R27,-Y
04A4 93EA ST R30,-Y
04A5 93FA ST R31,-Y
04A6 B70B IN R16,0x3B
(0318)
(0319) ;/*$PAGE*/.
(0320) ;********************************************************************************************************
(0321) ; SYSTEM TICK ISR
(0322) ;
(0323) ; Description : This function is the ISR used to notify uC/OS-II that a system tick has occurred.
(0324) ;
(0325) ; The following C-like pseudo-code describe the operation being performed in the code below.
(0326) ;
(0327) ; Save all registers on the current task's stack:
(0328) ; Use the PUSH_ALL macro
(0329) ; Get the SREG, set Bit #7 and save onto the task's stack using -Y addressing
(0330) ; Use the PUSH_SP macro to save the task's hardware stack pointer onto the current task's stack
(0331) ; OSIntNesting++;
(0332) ; if (OSIntNesting == 1) {
(0333) ; OSTCBCur->OSTCBStkPtr = SP
(0334) ; }
(0335) ; Clear the interrupt; Not needed for the timer we used.
(0336) ; OSTimeTick(); Notify uC/OS-II that a tick has occured
(0337) ; OSIntExit(); Notify uC/OS-II about end of ISR
(0338) ; Restore all registers that were save on the current task's stack:
(0339) ; Use the POP_SP macro to restore the task's hardware stack pointer
(0340) ; Use the POP_SREG macro to restore the SREG register
(0341) ; Use the POP_ALL macro to restore the remaining registers
(0342) ; Return (DO NOT use a RETI instruction);
(0343) ;********************************************************************************************************
(0344)
(0345) _OSTickISR::
(0346) PUSH_ALL ; Save all registers and status register
04A7 930A ST R16,-Y
(0347) IN R16,SREG ; Save the SREG but with interrupts enabled
04A8 B70F IN R16,0x3F
(0348) SBR R16,BIT07
04A9 6800 ORI R16,0x80
(0349) ST -Y,R16
04AA 930A ST R16,-Y
04AB B70E IN R16,0x3E
04AC 930A ST R16,-Y
04AD B70D IN R16,0x3D
(0350) PUSH_SP ; Save the task's hardware stack pointer onto task's stack
04AE 930A ST R16,-Y
(0351)
(0352) LDS R16,_OSIntNesting ; Notify uC/OS-II of ISR
04AF 91000917 LDS R16,OSIntNesting
(0353) INC R16 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -