📄 ucosii.lst
字号:
0436 9100014A LDS R16,_OSPrioHighRdy
(0214) STS _OSPrioCur,R16
0438 9300014B STS R16,_OSPrioCur
(0215)
(0216) LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
043A 91E0013F LDS R30,_OSTCBHighRdy
(0217) LDS R31,_OSTCBHighRdy+1 ; ready to run
043C 91F00140 LDS R31,_OSTCBHighRdy+1
(0218) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
043E 93E00143 STS R30,_OSTCBCur
(0219) STS _OSTCBCur+1,R31 ;
0440 93F00144 STS R31,_OSTCBCur+1
(0220)
(0221) LD R28,Z+ ; Restore Y pointer
0442 91C1 LD R28,Z+
(0222) LD R29,Z+ ;
0443 91D1 LD R29,Z+
0444 9109 LD R16,Y+
0445 BF0D OUT P3D,R16
0446 9109 LD R16,Y+
0447 BF0E OUT P3E,R16
0448 9109 LD R16,Y+
0449 BF0F OUT P3F,R16
044A 91F9 LD R31,Y+
044B 91E9 LD R30,Y+
044C 91B9 LD R27,Y+
044D 91A9 LD R26,Y+
044E 9199 LD R25,Y+
044F 9189 LD R24,Y+
0450 9179 LD R23,Y+
0451 9169 LD R22,Y+
0452 9159 LD R21,Y+
0453 9149 LD R20,Y+
0454 9139 LD R19,Y+
0455 9129 LD R18,Y+
0456 9119 LD R17,Y+
0457 9109 LD R16,Y+
0458 90F9 LD R15,Y+
0459 90E9 LD R14,Y+
045A 90D9 LD R13,Y+
045B 90C9 LD R12,Y+
045C 90B9 LD R11,Y+
045D 90A9 LD R10,Y+
045E 9099 LD R9,Y+
045F 9089 LD R8,Y+
0460 9079 LD R7,Y+
0461 9069 LD R6,Y+
0462 9059 LD R5,Y+
0463 9049 LD R4,Y+
0464 9039 LD R3,Y+
0465 9029 LD R2,Y+
0466 9019 LD R1,Y+
0467 9009 LD R0,Y+
(0223)
(0224) POPSP ; restore stack pointer
(0225) POPSREG ; restore SREG
(0226) POPRS ; restore registers
(0227) RET
0468 9508 RET
(0228)
(0229)
(0230) ;*******************************************************************************
(0231) ; INTERRUPT LEVEL CONTEXT SWITCH
(0232) ;
(0233) ; Description : This function is called by OSIntExit() to perform a context
(0234) ; switch to a task that has been made ready-to-run by an ISR.
(0235) ;
(0236) ; Note(s):
(0237) ; 1) Upon entry,
(0238) ; OSTCBCur points to the OS_TCB of the task to suspend
(0239) ; OSTCBHighRdy points to the OS_TCB of the task to resume
(0240) ;
(0241) ; 2) The stack frame of the task to suspend looks as follows:
(0242) ;
(0243) ; SP +0 --> LSB of return address of OSIntCtxSw() (Low memory)
(0244) ; +1 MSB of return address of OSIntCtxSw()
(0245) ; +2 LSB of return address of OSIntExit()
(0246) ; +3 MSB of return address of OSIntExit()
(0247) ; +4 LSB of task code address
(0248) ; +5 MSB of task code address (High memory)
(0249) ;
(0250) ; 3) The saved context of the task to resume looks as follows:
(0251) ;
(0252) ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low mem)
(0253) ; MSB of (return) stack pointer
(0254) ; Flags to load in status register
(0255) ; R31
(0256) ; R30
(0257) ; R7
(0258) ; .
(0259) ; .
(0260) ; .
(0261) ; R0 (High memory)
(0262) ;*******************************************************************************
(0263)
(0264) _OSIntCtxSw::
(0265) IN R30,SPL ; Z = SP
_OSIntCtxSw:
0469 B7ED IN R30,P3D
(0266) IN R31,SPH
046A B7FE IN R31,P3E
(0267) ; ADIW R30,4 ; (Uncomment if OS_CRITICAL_METHOD is 1, see OS_CPU.H)
(0268) ADIW R30,5 ; Adjust Z to point to task return address
046B 9635 ADIW R30,5
(0269) ST -Y,R31 ; Save SP
046C 93FA ST R31,-Y
(0270) ST -Y,R30 ;
046D 93EA ST R30,-Y
(0271)
(0272) LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
046E 91E00143 LDS R30,_OSTCBCur
(0273) LDS R31,_OSTCBCur+1 ;
0470 91F00144 LDS R31,_OSTCBCur+1
(0274) ST Z+,R28 ; Save Y pointer
0472 93C1 ST R28,Z+
(0275) ST Z+,R29 ;
0473 93D1 ST R29,Z+
(0276)
(0277) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
0474 9100014A LDS R16,_OSPrioHighRdy
(0278) STS _OSPrioCur,R16 ;
0476 9300014B STS R16,_OSPrioCur
(0279)
(0280) LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
0478 91E0013F LDS R30,_OSTCBHighRdy
(0281) LDS R31,_OSTCBHighRdy+1 ;
047A 91F00140 LDS R31,_OSTCBHighRdy+1
(0282) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
047C 93E00143 STS R30,_OSTCBCur
(0283) STS _OSTCBCur+1,R31 ;
047E 93F00144 STS R31,_OSTCBCur+1
(0284)
(0285) LD R28,Z+ ; Restore Y pointer
0480 91C1 LD R28,Z+
(0286) LD R29,Z+ ;
0481 91D1 LD R29,Z+
0482 9109 LD R16,Y+
0483 BF0D OUT P3D,R16
0484 9109 LD R16,Y+
0485 BF0E OUT P3E,R16
0486 9109 LD R16,Y+
0487 BF0F OUT P3F,R16
0488 91F9 LD R31,Y+
0489 91E9 LD R30,Y+
048A 91B9 LD R27,Y+
048B 91A9 LD R26,Y+
048C 9199 LD R25,Y+
048D 9189 LD R24,Y+
048E 9179 LD R23,Y+
048F 9169 LD R22,Y+
0490 9159 LD R21,Y+
0491 9149 LD R20,Y+
0492 9139 LD R19,Y+
0493 9129 LD R18,Y+
0494 9119 LD R17,Y+
0495 9109 LD R16,Y+
0496 90F9 LD R15,Y+
0497 90E9 LD R14,Y+
0498 90D9 LD R13,Y+
0499 90C9 LD R12,Y+
049A 90B9 LD R11,Y+
049B 90A9 LD R10,Y+
049C 9099 LD R9,Y+
049D 9089 LD R8,Y+
049E 9079 LD R7,Y+
049F 9069 LD R6,Y+
04A0 9059 LD R5,Y+
04A1 9049 LD R4,Y+
04A2 9039 LD R3,Y+
04A3 9029 LD R2,Y+
04A4 9019 LD R1,Y+
04A5 9009 LD R0,Y+
(0287) POPSP ; restore stack pointer
(0288) POPSREG ; restore SREG
(0289) POPRS ; restore registers
(0290) RET
04A6 9508 RET
(0291)
(0292) ;******************************************************************************
(0293) ; SYSTEM TICK ISR
(0294) ;
(0295) ; Description: This function is the ISR used to notify uC/OS-II that a system
(0296) ; tick has occurred.
(0297) ;
(0298) ;
(0299) ;*******************************************************************************
(0300) ;
(0301) _OSTickISR::
(0302) NOP
_OSTickISR:
04A7 0000 NOP
04A8 920A ST R0,-Y
04A9 921A ST R1,-Y
04AA 922A ST R2,-Y
04AB 923A ST R3,-Y
04AC 924A ST R4,-Y
04AD 925A ST R5,-Y
04AE 926A ST R6,-Y
04AF 927A ST R7,-Y
04B0 928A ST R8,-Y
04B1 929A ST R9,-Y
04B2 92AA ST R10,-Y
04B3 92BA ST R11,-Y
04B4 92CA ST R12,-Y
04B5 92DA ST R13,-Y
04B6 92EA ST R14,-Y
04B7 92FA ST R15,-Y
04B8 930A ST R16,-Y
04B9 931A ST R17,-Y
04BA 932A ST R18,-Y
04BB 933A ST R19,-Y
04BC 934A ST R20,-Y
04BD 935A ST R21,-Y
04BE 936A ST R22,-Y
04BF 937A ST R23,-Y
04C0 938A ST R24,-Y
04C1 939A ST R25,-Y
04C2 93AA ST R26,-Y
04C3 93BA ST R27,-Y
04C4 93EA ST R30,-Y
04C5 93FA ST R31,-Y
(0303) PUSHRS ; save all registers
(0304) IN R16, SREG
04C6 B70F IN R16,P3F
(0305) SBR R16, 0x80 ; bei Aufruf dieser ISR geloeschtes I-Flag setzen
04C7 6800 ORI R16,0x80
(0306) ST -Y, R16
04C8 930A ST R16,-Y
(0307)
(0308) ; TimerCounter aufrischen
(0309) LDI R16,6; Reload TC_2, 2ms bei 8MHz
04C9 E006 LDI R16,6
(0310) OUT TCNT2,R16
04CA BD04 OUT P24,R16
(0311)
(0312) LDS R16,_OSIntNesting ; Notify uC/OS-II of ISR
04CB 9100014D LDS R16,_OSIntNesting
(0313) INC R16 ;
04CD 9503 INC R16
(0314) STS _OSIntNesting,R16 ;
04CE 9300014D STS R16,_OSIntNesting
(0315)
(0316) CALL _OSTimeTick ; Call uC/OS-II's tick updating function
04D0 940E0375 CALL _OSTimeTick
(0317) ; bearbeitet die tasktimer, wenn 0 --> deren Prio in Aufruftab stellen
(0318)
(0319) CALL _OSIntExit ; Notify uC/OS-II about end of ISR
04D2 940E01BD CALL _OSIntExit
04D4 9109 LD R16,Y+
04D5 BF0F OUT P3F,R16
04D6 91F9 LD R31,Y+
04D7 91E9 LD R30,Y+
04D8 91B9 LD R27,Y+
04D9 91A9 LD R26,Y+
04DA 9199 LD R25,Y+
04DB 9189 LD R24,Y+
04DC 9179 LD R23,Y+
04DD 9169 LD R22,Y+
04DE 9159 LD R21,Y+
04DF 9149 LD R20,Y+
04E0 9139 LD R19,Y+
04E1 9129 LD R18,Y+
04E2 9119 LD R17,Y+
04E3 9109 LD R16,Y+
04E4 90F9 LD R15,Y+
04E5 90E9 LD R14,Y+
04E6 90D9 LD R13,Y+
04E7 90C9 LD R12,Y+
04E8 90B9 LD R11,Y+
04E9 90A9 LD R10,Y+
04EA 9099 LD R9,Y+
04EB 9089 LD R8,Y+
04EC 9079 LD R7,Y+
04ED 9069 LD R6,Y+
04EE 9059 LD R5,Y+
04EF 9049 LD R4,Y+
04F0 9039 LD R3,Y+
04F1 9029 LD R2,Y+
04F2 9019 LD R1,Y+
04F3 9009 LD R0,Y+
(0320) ; fuehrt gegebenfalls einen Context-Switch aus
(0321)
(0322) POPSREG ; restore SREG
(0323) POPRS ; restore all registers
(0324) RET ; Note: RET instead of RETI
04F4 9508 RET
_OSTaskStkInit:
stks --> R10
tmp --> R22
stk --> R20
opt --> Y+8
ptos --> Y+6
pdata --> R18
task --> R16
04F5 940E0893 CALL push_gset3
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\21_uCOSII\os_task.c
(0001)
(0002) #ifndef OS_MASTER_FILE
(0003) #include "includes.h"
(0004) #endif
(0005)
(0006) /*$PAGE*/
(0007) /*
(0008) *********************************************************************************************************
(0009) * CREATE A TASK
(0010) *
(0011) * Description: This function is used to have uC/OS-II manage the execution of a task. Tasks can either
(0012) * be created prior to the start of multitasking or by a running task. A task cannot be
(0013) * created by an ISR.
(0014) *
(0015) * Arguments : task is a pointer to the task's code
(0016) *
(0017) * pdata is a pointer to an optional data area which can be used to pass parameters to
(0018) * the task when the task first executes. Where the task is concerned it thinks
(0019) * it was invoked and passed the argument 'pdata' as follows:
(0020) *
(0021) * void Task (void *pdata)
(0022) * {
(0023) * for (;;) {
(0024) * Task code;
(0025) * }
(0026) * }
(0027) *
(0028) * ptos is a pointer to the task's top of stack. If the configuration constant
(0029) * OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high
(0030) * memory to low memory). 'pstk' will thus point to the highest (valid) memory
(0031) * location of the stack. If OS_STK_GROWTH is set to 0, 'pstk' will point to the
(0032) * lowest memory location of the stack and the stack will grow with increasing
(0033) * memory locations.
(0034) *
(0035) * prio is the task's priority. A unique priority MUST be assigned to each task and the
(0036) * lower the number, the higher the priority.
(0037) *
(0038) * Returns : OS_NO_ERR if the function was successful.
(0039) * OS_PRIO_EXIT if the task priority already exist
(0040) * (each task MUST have a unique priority).
(0041) * O
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -