📄 ucos.lst
字号:
0277 F310 BCS 0x025A
(0106) }
(0107) OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
0278 2422 CLR R2
0279 2433 CLR R3
027A 9230017A STS 0x17A,R3
027C 92200179 STS 0x179,R2
(0108) OSTCBFreeList = &OSTCBTbl[0];
027E E381 LDI R24,0x31
027F E091 LDI R25,1
0280 93900213 STS _OSTCBFreeList+1,R25
0282 93800212 STS _OSTCBFreeList,R24
(0109)
(0110) #if OS_MAX_EVENTS >= 2
(0111) for (i = 0; i < (OS_MAX_EVENTS - 1); i++) { /* Init. list of free EVENT control blocks */
0284 24AA CLR R10
0285 24BB CLR R11
0286 C019 RJMP 0x02A0
(0112) OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
0287 0195 MOVW R18,R10
0288 5F2F SUBI R18,0xFF
0289 4F3F SBCI R19,0xFF
028A E008 LDI R16,0x8
028B E010 LDI R17,0
028C D540 RCALL empy16s
028D 0118 MOVW R2,R16
028E E283 LDI R24,0x23
028F E092 LDI R25,2
0290 0E28 ADD R2,R24
0291 1E39 ADC R3,R25
0292 E008 LDI R16,0x8
0293 E010 LDI R17,0
0294 0195 MOVW R18,R10
0295 D537 RCALL empy16s
0296 01F8 MOVW R30,R16
0297 E283 LDI R24,0x23
0298 E092 LDI R25,2
0299 0FE8 ADD R30,R24
029A 1FF9 ADC R31,R25
029B 8220 STD R2,0+Z
029C 8231 STD R3,1+Z
029D 01C5 MOVW R24,R10
029E 9601 ADIW R24,1
029F 015C MOVW R10,R24
02A0 01C5 MOVW R24,R10
02A1 3081 CPI R24,1
02A2 E0E0 LDI R30,0
02A3 079E CPC R25,R30
02A4 F310 BCS 0x0287
(0113) }
(0114) OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
02A5 2422 CLR R2
02A6 2433 CLR R3
02A7 9230022C STS 0x22C,R3
02A9 9220022B STS 0x22B,R2
(0115) OSEventFreeList = &OSEventTbl[0];
02AB E283 LDI R24,0x23
02AC E092 LDI R25,2
02AD 93900234 STS _OSEventFreeList+1,R25
02AF 93800233 STS _OSEventFreeList,R24
(0116) #endif
(0117)
(0118) #if OS_STK_GROWTH == 1
(0119) OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
02B1 E08F LDI R24,0xF
02B2 838A STD R24,2+Y
02B3 EE88 LDI R24,0xE8
02B4 E091 LDI R25,1
02B5 8388 STD R24,0+Y
02B6 8399 STD R25,1+Y
02B7 2722 CLR R18
02B8 2733 CLR R19
02B9 E20A LDI R16,0x2A
02BA E010 LDI R17,0
02BB D315 RCALL _OSTaskCreate
(0120) #else
(0121) OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
(0122) #endif
(0123)
(0124) }
02BC 9623 ADIW R28,3
02BD D51F RCALL pop_gset3x
02BE 9508 RET
(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();
_OSIntExit:
02BF 930A ST R16,-Y
02C0 B70F IN R16,P3F
02C1 94F8 BCLR 7
02C2 930F PUSH R16
02C3 9109 LD R16,Y+
(0148) if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
02C4 9180021E LDS R24,_OSIntNesting
02C6 5081 SUBI R24,1
02C7 2E28 MOV R2,R24
02C8 9220021E STS _OSIntNesting,R2
02CA 9040021D LDS R4,_OSLockNesting
02CC 2824 OR R2,R4
02CD F009 BEQ 0x02CF
02CE C04F RJMP 0x031E
(0149) OSIntExitY = OSUnMapTbl[OSRdyGrp];
02CF E384 LDI R24,0x34
02D0 E090 LDI R25,0
02D1 91E0021A LDS R30,_OSRdyGrp
02D3 27FF CLR R31
02D4 0FE8 ADD R30,R24
02D5 1FF9 ADC R31,R25
02D6 91E4 LPM R30,0(Z)
02D7 93E001E9 STS 0x1E9,R30
(0150) OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
02D9 E188 LDI R24,0x18
02DA E092 LDI R25,2
02DB 27FF CLR R31
02DC 0FE8 ADD R30,R24
02DD 1FF9 ADC R31,R25
02DE 81E0 LDD R30,0+Z
02DF 27FF CLR R31
02E0 E384 LDI R24,0x34
02E1 E090 LDI R25,0
02E2 0FE8 ADD R30,R24
02E3 1FF9 ADC R31,R25
02E4 9024 LPM R2,0(Z)
02E5 2433 CLR R3
02E6 904001E9 LDS R4,0x1E9
02E8 2455 CLR R5
02E9 0C44 LSL R4
02EA 1C55 ROL R5
02EB 0C44 LSL R4
02EC 1C55 ROL R5
02ED 0C44 LSL R4
02EE 1C55 ROL R5
02EF 0C42 ADD R4,R2
02F0 1C53 ADC R5,R3
02F1 9240021B STS _OSPrioHighRdy,R4
(0151) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
02F3 9020021C LDS R2,_OSPrioCur
02F5 1442 CP R4,R2
02F6 F139 BEQ 0x031E
(0152) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
02F7 2C24 MOV R2,R4
02F8 E082 LDI R24,2
02F9 9D82 MUL R24,R2
02FA 01F0 MOVW R30,R0
02FB EE8E LDI R24,0xEE
02FC E091 LDI R25,1
02FD 0FE8 ADD R30,R24
02FE 1FF9 ADC R31,R25
02FF 8020 LDD R2,0+Z
0300 8031 LDD R3,1+Z
0301 92300211 STS _OSTCBHighRdy+1,R3
0303 92200210 STS _OSTCBHighRdy,R2
(0153) OSCtxSwCtr++; /* Keep track of the number of context switches */
0305 E081 LDI R24,1
0306 E090 LDI R25,0
0307 E0A0 LDI R26,0
0308 E0B0 LDI R27,0
0309 90400237 LDS R4,_OSCtxSwCtr+2
030B 90500238 LDS R5,_OSCtxSwCtr+3
030D 90200235 LDS R2,_OSCtxSwCtr
030F 90300236 LDS R3,_OSCtxSwCtr+1
0311 0E28 ADD R2,R24
0312 1E39 ADC R3,R25
0313 1E4A ADC R4,R26
0314 1E5B ADC R5,R27
0315 92300236 STS _OSCtxSwCtr+1,R3
0317 92200235 STS _OSCtxSwCtr,R2
0319 92500238 STS _OSCtxSwCtr+3,R5
031B 92400237 STS _OSCtxSwCtr+2,R4
(0154) OSIntCtxSw(); /* Perform interrupt level context switch */
031D D40F RCALL _OSIntCtxSw
(0155) }
(0156) }
(0157) OS_EXIT_CRITICAL();
031E 930A ST R16,-Y
031F 910F POP R16
0320 BF0F OUT P3F,R16
0321 9109 LD R16,Y+
(0158) }
0322 9508 RET
_OSSched:
y --> R10
0323 D4C9 RCALL push_gset3x
(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();
0324 930A ST R16,-Y
0325 B70F IN R16,P3F
0326 94F8 BCLR 7
0327 930F PUSH R16
0328 9109 LD R16,Y+
(0183) if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
0329 9020021E LDS R2,_OSIntNesting
032B 9030021D LDS R3,_OSLockNesting
032D 2832 OR R3,R2
032E F009 BEQ 0x0330
032F C04D RJMP 0x037D
(0184) y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
0330 E384 LDI R24,0x34
0331 E090 LDI R25,0
0332 91E0021A LDS R30,_OSRdyGrp
0334 27FF CLR R31
0335 0FE8 ADD R30,R24
0336 1FF9 ADC R31,R25
0337 90A4 LPM R10,0(Z)
(0185) OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
0338 E188 LDI R24,0x18
0339 E092 LDI R25,2
033A 2DEA MOV R30,R10
033B 27FF CLR R31
033C 0FE8 ADD R30,R24
033D 1FF9 ADC R31,R25
033E 81E0 LDD R30,0+Z
033F 27FF CLR R31
0340 E384 LDI R24,0x34
0341 E090 LDI R25,0
0342 0FE8 ADD R30,R24
0343 1FF9 ADC R31,R25
0344 9024 LPM R2,0(Z)
0345 2433 CLR R3
0346 2C4A MOV R4,R10
0347 2455 CLR R5
0348 0C44 LSL R4
0349 1C55 ROL R5
034A 0C44 LSL R4
034B 1C55 ROL R5
034C 0C44 LSL R4
034D 1C55 ROL R5
034E 0C42 ADD R4,R2
034F 1C53 ADC R5,R3
0350 9240021B STS _OSPrioHighRdy,R4
(0186) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0352 9020021C LDS R2,_OSPrioCur
0354 1442 CP R4,R2
0355 F139 BEQ 0x037D
(0187) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
0356 2C24 MOV R2,R4
0357 E082 LDI R24,2
0358 9D82 MUL R24,R2
0359 01F0 MOVW R30,R0
035A EE8E LDI R24,0xEE
035B E091 LDI R25,1
035C 0FE8 ADD R30,R24
035D 1FF9 ADC R31,R25
035E 8020 LDD R2,0+Z
035F 8031 LDD R3,1+Z
0360 92300211 STS _OSTCBHighRdy+1,R3
0362 92200210 STS _OSTCBHighRdy,R2
(0188) OSCtxSwCtr++; /* Increment context switch counter */
0364 E081 LDI R24,1
0365 E090 LDI R25,0
0366 E0A0 LDI R26,0
0367 E0B0 LDI R27,0
0368 90400237 LDS R4,_OSCtxSwCtr+2
036A 90500238 LDS R5,_OSCtxSwCtr+3
036C 90200235 LDS R2,_OSCtxSwCtr
036E 90300236 LDS R3,_OSCtxSwCtr+1
0370 0E28 ADD R2,R24
0371 1E39 ADC R3,R25
0372 1E4A ADC R4,R26
0373 1E5B ADC R5,R27
0374 92300236 STS _OSCtxSwCtr+1,R3
0376 92200235 STS _OSCtxSwCtr,R2
0378 92500238 STS _OSCtxSwCtr+3,R5
037A 92400237 STS _OSCtxSwCtr+2,R4
(0189) OS_TASK_SW(); /* Perform a context switch */
037C D353 RCALL _OSCtxSw
(0190) }
(0191) }
(0192) OS_EXIT_CRITICAL();
037D 930A ST R16,-Y
037E 910F POP R16
037F BF0F OUT P3F,R16
0380 9109 LD R16,Y+
(0193) }
0381 D45B RCALL pop_gset3x
0382 9508 RET
_OSStart:
x --> R12
y --> R10
0383 D46C RCALL push_gset4x
(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) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -