?? ucos.lst
字號:
02EA 1C55 ROL R5
02EB 0C42 ADD R4,R2
02EC 1C53 ADC R5,R3
02ED 9240021B STS OSPrioHighRdy,R4
02EF 2C24 MOV R2,R4
02F2 E082 LDI R24,2
02F3 9D82 MUL R24,R2
02F4 01F0 MOVW R30,R0
02F5 EE8E LDI R24,0xEE
02F6 E091 LDI R25,1
02F7 0FE8 ADD R30,R24
02F8 1FF9 ADC R31,R25
02F9 8020 LDD R2,Z+0
02FA 8031 LDD R3,Z+1
02FB 92300211 STS OSTCBHighRdy+1,R3
02FD 92200210 STS OSTCBHighRdy,R2
02FF 92300215 STS OSTCBCur+1,R3
0301 92200214 STS OSTCBCur,R2
0303 940E0642 CALL _OSStartHighRdy
0305 940E0777 CALL pop_gset4x
(0113) }
(0114) OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
0307 9508 RET
_OSTaskIdle:
pdata --> R16
0308 930A ST R16,-Y
0309 B70F IN R16,0x3F
030A 94F8 BCLR 7
030B 930F PUSH R16
(0115) OSEventFreeList = &OSEventTbl[0];
030C 9109 LD R16,Y+
030D E081 LDI R24,1
030E E090 LDI R25,0
030F E0A0 LDI R26,0
0310 E0B0 LDI R27,0
0311 90400221 LDS R4,OSIdleCtr+2
(0116) #endif
(0117)
(0118) #if OS_STK_GROWTH == 1
(0119) OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
0313 90500222 LDS R5,OSIdleCtr+3
0315 9020021F LDS R2,OSIdleCtr
0317 90300220 LDS R3,OSIdleCtr+1
0319 0E28 ADD R2,R24
031A 1E39 ADC R3,R25
031B 1E4A ADC R4,R26
031C 1E5B ADC R5,R27
031D 92300220 STS OSIdleCtr+1,R3
031F 9220021F STS OSIdleCtr,R2
(0120) #else
(0121) OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
(0122) #endif
(0123)
(0124) }
(0125) /*$PAGE*/
(0126) /*
(0127) *********************************************************************************************************
(0128) * EXIT ISR
(0129) *
(0130) * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR. When
(0131) * the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
(0132) * a new, high-priority task, is ready to run.
(0133) *
(0134) * Arguments : none
(0135) *
(0136) * Returns : none
(0137) *
(0138) * Notes : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words, for every call
(0139) * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
(0140) * end of the ISR.
(0141) * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
(0142) *********************************************************************************************************
(0143) */
(0144)
(0145) void OSIntExit (void)
(0146) {
(0147) OS_ENTER_CRITICAL();
0321 92500222 STS OSIdleCtr+3,R5
0323 92400221 STS OSIdleCtr+2,R4
0325 930A ST R16,-Y
(0148) if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
0326 910F POP R16
0327 BF0F OUT 0x3F,R16
0328 9109 LD R16,Y+
0329 CFDE RJMP _OSTaskIdle
032A 9508 RET
_OSTCBInit:
ptcb --> R10
opt --> Y+10
pext --> Y+8
stk_size --> Y+6
id --> Y+4
pbos --> Y+2
ptos --> R18
prio --> R16
032B 940E077D CALL push_gset3x
032D 930A ST R16,-Y
032E B70F IN R16,0x3F
032F 94F8 BCLR 7
0330 930F PUSH R16
(0149) OSIntExitY = OSUnMapTbl[OSRdyGrp];
0331 9109 LD R16,Y+
0332 90A00212 LDS R10,OSTCBFreeList
0334 90B00213 LDS R11,OSTCBFreeList+1
0336 20AA TST R10
0337 F419 BNE 0x033B
0338 20BB TST R11
0339 F409 BNE 0x033B
033A C07C RJMP 0x03B7
(0150) OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
033B 01F5 MOVW R30,R10
033C 8022 LDD R2,Z+2
033D 8033 LDD R3,Z+3
033E 92300213 STS OSTCBFreeList+1,R3
0340 92200212 STS OSTCBFreeList,R2
0342 930A ST R16,-Y
0343 910F POP R16
0344 BF0F OUT 0x3F,R16
0345 9109 LD R16,Y+
0346 01F5 MOVW R30,R10
0347 8331 STD Z+1,R19
0348 8320 STD Z+0,R18
0349 8701 STD Z+9,R16
034A 2422 CLR R2
034B 01F5 MOVW R30,R10
034C 8620 STD Z+8,R2
034D 2433 CLR R3
034E 01F5 MOVW R30,R10
034F 8237 STD Z+7,R3
0350 8226 STD Z+6,R2
0351 2E20 MOV R2,R16
0352 9426 LSR R2
0353 9426 LSR R2
0354 9426 LSR R2
(0151) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0355 01F5 MOVW R30,R10
0356 8623 STD Z+11,R2
0357 E58A LDI R24,0x5A
0358 E090 LDI R25,0
(0152) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
0359 01F5 MOVW R30,R10
035A 85E3 LDD R30,Z+11
035B 27FF CLR R31
035C 0FE8 ADD R30,R24
035D 1FF9 ADC R31,R25
035E 91E4 LPM R30,0(Z)
035F 01D5 MOVW R26,R10
0360 961D ADIW R26,0xD
0361 93EC ST R30,0(X)
0362 2F80 MOV R24,R16
0363 7087 ANDI R24,7
0364 01F5 MOVW R30,R10
0365 8782 STD Z+10,R24
0366 E58A LDI R24,0x5A
(0153) OSCtxSwCtr++; /* Keep track of the number of context switches */
0367 E090 LDI R25,0
0368 01F5 MOVW R30,R10
0369 85E2 LDD R30,Z+10
036A 27FF CLR R31
036B 0FE8 ADD R30,R24
036C 1FF9 ADC R31,R25
036D 91E4 LPM R30,0(Z)
036E 01D5 MOVW R26,R10
036F 961C ADIW R26,0xC
0370 93EC ST R30,0(X)
0371 930A ST R16,-Y
0372 B70F IN R16,0x3F
0373 94F8 BCLR 7
0374 930F PUSH R16
0375 9109 LD R16,Y+
0376 E082 LDI R24,2
0377 9F80 MUL R24,R16
0378 01F0 MOVW R30,R0
0379 EE8E LDI R24,0xEE
037A E091 LDI R25,1
037B 0FE8 ADD R30,R24
037C 1FF9 ADC R31,R25
037D 82B1 STD Z+1,R11
037E 82A0 STD Z+0,R10
(0154) OSIntCtxSw(); /* Perform interrupt level context switch */
037F 9020020E LDS R2,OSTCBList
(0155) }
(0156) }
(0157) OS_EXIT_CRITICAL();
0381 9030020F LDS R3,OSTCBList+1
0383 01F5 MOVW R30,R10
0384 8233 STD Z+3,R3
0385 8222 STD Z+2,R2
0386 2422 CLR R2
0387 2433 CLR R3
(0158) }
(0159) /*$PAGE*/
(0160) /*
(0161) *********************************************************************************************************
(0162) * SCHEDULER
(0163) *
(0164) * Description: This function is called by other uC/OS-II services to determine whether a new, high
(0165) * priority task has been made ready to run. This function is invoked by TASK level code
(0166) * and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
(0167) *
(0168) * Arguments : none
(0169) *
(0170) * Returns : none
(0171) *
(0172) * Notes : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
(0173) * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
(0174) *********************************************************************************************************
(0175) */
(0176)
(0177) void OSSched (void)
(0178) {
(0179) INT8U y;
(0180)
(0181)
(0182) OS_ENTER_CRITICAL();
0388 01F5 MOVW R30,R10
0389 8235 STD Z+5,R3
038A 8224 STD Z+4,R2
038B 9020020E LDS R2,OSTCBList
(0183) if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
038D 9030020F LDS R3,OSTCBList+1
038F 2022 TST R2
0390 F411 BNE 0x0393
0391 2033 TST R3
0392 F031 BEQ 0x0399
0393 91E0020E LDS R30,OSTCBList
(0184) y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
0395 91F0020F LDS R31,OSTCBList+1
0397 82B5 STD Z+5,R11
0398 82A4 STD Z+4,R10
0399 92B0020F STS OSTCBList+1,R11
039B 92A0020E STS OSTCBList,R10
(0185) OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
039D 01F5 MOVW R30,R10
039E 8425 LDD R2,Z+13
039F 9030021A LDS R3,OSRdyGrp
03A1 2832 OR R3,R2
03A2 9230021A STS OSRdyGrp,R3
03A4 E188 LDI R24,0x18
03A5 E092 LDI R25,2
03A6 01F5 MOVW R30,R10
03A7 8423 LDD R2,Z+11
03A8 2433 CLR R3
03A9 0E28 ADD R2,R24
03AA 1E39 ADC R3,R25
03AB 01F5 MOVW R30,R10
03AC 8444 LDD R4,Z+12
03AD 01F1 MOVW R30,R2
03AE 8050 LDD R5,Z+0
03AF 2854 OR R5,R4
03B0 8250 STD Z+0,R5
03B1 930A ST R16,-Y
03B2 910F POP R16
03B3 BF0F OUT 0x3F,R16
03B4 9109 LD R16,Y+
03B5 2700 CLR R16
(0186) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
03B6 C005 RJMP 0x03BC
03B7 930A ST R16,-Y
03B8 910F POP R16
03B9 BF0F OUT 0x3F,R16
(0187) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
03BA 9109 LD R16,Y+
03BB E406 LDI R16,0x46
03BC 940E076B CALL pop_gset3x
03BE 9508 RET
_OSTimeTick:
ptcb --> R16
03BF 9100020E LDS R16,OSTCBList
03C1 9110020F LDS R17,OSTCBList+1
03C3 C03F RJMP 0x0403
03C4 930A ST R16,-Y
03C5 B70F IN R16,0x3F
03C6 94F8 BCLR 7
03C7 930F PUSH R16
(0188) OSCtxSwCtr++; /* Increment context switch counter */
03C8 9109 LD R16,Y+
03C9 01F8 MOVW R30,R16
03CA 8026 LDD R2,Z+6
03CB 8037 LDD R3,Z+7
03CC 2022 TST R2
03CD F419 BNE 0x03D1
03CE 2033 TST R3
03CF F409 BNE 0x03D1
03D0 C02B RJMP 0x03FC
03D1 01C8 MOVW R24,R16
03D2 9606 ADIW R24,6
03D3 01FC MOVW R30,R24
03D4 8180 LDD R24,Z+0
03D5 8191 LDD R25,Z+1
03D6 9701 SBIW R24,1
03D7 012C MOVW R4,R24
03D8 8251 STD Z+1,R5
03D9 8240 STD Z+0,R4
03DA 3080 CPI R24,0
03DB 0789 CPC R24,R25
03DC F009 BEQ 0x03DE
03DD C01E RJMP 0x03FC
03DE 01F8 MOVW R30,R16
03DF 8420 LDD R2,Z+8
(0189) OS_TASK_SW(); /* Perform a context switch */
03E0 FC23 SBRC R2,3
03E1 C015 RJMP 0x03F7
(0190) }
(0191) }
(0192) OS_EXIT_CRITICAL();
03E2 01F8 MOVW R30,R16
03E3 8425 LDD R2,Z+13
03E4 9030021A LDS R3,OSRdyGrp
03E6 2832 OR R3,R2
03E7 9230021A STS OSRdyGrp,R3
03E9 E188 LDI R24,0x18
03EA E092 LDI R25,2
(0193) }
(0194) /*$PAGE*/
(0195) /*
(0196) *********************************************************************************************************
(0197) * START MULTITASKING
(0198) *
(0199) * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
(0200) * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
(0201) * and you MUST have created at least one task.
(0202) *
(0203) * Arguments : none
(0204) *
(0205) * Returns : none
(0206) *
(0207) * Note : OSStartHighRdy() MUST:
(0208) * a) Call OSTaskSwHook() then,
(0209) * b) Set OSRunning to TRUE.
(0210) *********************************************************************************************************
(0211) */
(0212)
(0213) void OSStart (void)
(0214) {
(0215) INT8U y;
(0216) INT8U x;
(0217)
(0218)
(0219) if (OSRunning == FALSE) {
03EB 01F8 MOVW R30,R16
03EC 8423 LDD R2,Z+11
03ED 2433 CLR R3
03EE 0E28 ADD R2,R24
03EF 1E39 ADC R3,R25
(0220) y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -