📄 ucos.lst
字号:
(0061)
(0062) /*$PAGE*/
(0063) /*
(0064) *********************************************************************************************************
(0065) * INITIALIZATION
(0066) *
(0067) * Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
(0068) * creating any uC/OS-II object and, prior to calling OSStart().
(0069) *
(0070) * Arguments : none
(0071) *
(0072) * Returns : none
(0073) *********************************************************************************************************
(0074) */
(0075)
(0076) void OSInit (void)
(0077) {
(0078) INT16U i;
(0079)
(0080)
(0081) OSTime = 0L; /* Clear the 32-bit system clock */
017A CFF6 RJMP 0x0171
017B 940E083A CALL pop_gset3x
017D 9508 RET
_OSInit:
i --> R10
017E 940E084C CALL push_gset3x
0180 9723 SBIW R28,3
0181 E080 LDI R24,0
0182 E090 LDI R25,0
0183 E0A0 LDI R26,0
0184 E0B0 LDI R27,0
(0082) OSIntNesting = 0; /* Clear the interrupt nesting counter */
0185 9390029F STS OSTime+1,R25
0187 9380029E STS OSTime,R24
(0083) OSLockNesting = 0; /* Clear the scheduling lock counter */
0189 93B002A1 STS OSTime+3,R27
(0084) #if OS_TASK_CREATE_EN || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
(0085) OSTaskCtr = 0; /* Clear the number of tasks */
018B 93A002A0 STS OSTime+2,R26
(0086) #endif
(0087) OSRunning = FALSE; /* Indicate that multitasking not started */
018D 2422 CLR R2
(0088) OSIdleCtr = 0L; /* Clear the 32-bit idle counter */
018E 922002D2 STS OSIntNesting,R2
0190 922002D1 STS OSLockNesting,R2
0192 922002CA STS OSTaskCtr,R2
0194 922002CB STS OSRunning,R2
0196 E080 LDI R24,0
0197 E090 LDI R25,0
0198 E0A0 LDI R26,0
0199 E0B0 LDI R27,0
(0089)
(0090) OSCtxSwCtr = 0; /* Clear the context switch counter */
019A 939002D4 STS OSIdleCtr+1,R25
019C 938002D3 STS OSIdleCtr,R24
019E 93B002D6 STS OSIdleCtr+3,R27
01A0 93A002D5 STS OSIdleCtr+2,R26
01A2 E080 LDI R24,0
01A3 E090 LDI R25,0
01A4 E0A0 LDI R26,0
01A5 E0B0 LDI R27,0
(0091) OSRdyGrp = 0; /* Clear the ready list */
01A6 939002EA STS OSCtxSwCtr+1,R25
(0092) for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
01A8 938002E9 STS OSCtxSwCtr,R24
01AA 93B002EC STS OSCtxSwCtr+3,R27
(0093) OSRdyTbl[i] = 0;
01AC 93A002EB STS OSCtxSwCtr+2,R26
01AE 922002CE STS OSRdyGrp,R2
01B0 24AA CLR R10
01B1 24BB CLR R11
01B2 C00A RJMP 0x01BD
01B3 EC8C LDI R24,0xCC
01B4 E092 LDI R25,2
01B5 01F5 MOVW R30,R10
01B6 0FE8 ADD R30,R24
01B7 1FF9 ADC R31,R25
01B8 2422 CLR R2
01B9 8220 STD Z+0,R2
(0094) }
(0095)
(0096) OSPrioCur = 0;
01BA 01C5 MOVW R24,R10
01BB 9601 ADIW R24,1
01BC 015C MOVW R10,R24
(0097) OSPrioHighRdy = 0;
01BD 01C5 MOVW R24,R10
01BE 3082 CPI R24,2
(0098) OSTCBHighRdy = (OS_TCB *)0; /* TCB Initialization */
01BF E0E0 LDI R30,0
01C0 079E CPC R25,R30
01C1 F388 BCS 0x01B3
01C2 2422 CLR R2
01C3 922002D0 STS OSPrioCur,R2
(0099) OSTCBCur = (OS_TCB *)0;
01C5 922002CF STS OSPrioHighRdy,R2
01C7 2433 CLR R3
(0100) OSTCBList = (OS_TCB *)0;
01C8 923002C5 STS OSTCBHighRdy+1,R3
01CA 922002C4 STS OSTCBHighRdy,R2
(0101) for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) { /* Clear the priority table */
01CC 923002C9 STS OSTCBCur+1,R3
01CE 922002C8 STS OSTCBCur,R2
(0102) OSTCBPrioTbl[i] = (OS_TCB *)0;
01D0 923002C3 STS OSTCBList+1,R3
01D2 922002C2 STS OSTCBList,R2
01D4 24AA CLR R10
01D5 24BB CLR R11
01D6 C011 RJMP 0x01E8
01D7 E002 LDI R16,2
01D8 E010 LDI R17,0
01D9 0195 MOVW R18,R10
01DA 940E082A CALL empy16s
01DC 01F8 MOVW R30,R16
01DD EA82 LDI R24,0xA2
01DE E092 LDI R25,2
01DF 0FE8 ADD R30,R24
01E0 1FF9 ADC R31,R25
01E1 2422 CLR R2
01E2 2433 CLR R3
01E3 8231 STD Z+1,R3
01E4 8220 STD Z+0,R2
(0103) }
(0104) for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs */
01E5 01C5 MOVW R24,R10
01E6 9601 ADIW R24,1
01E7 015C MOVW R10,R24
(0105) OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
01E8 01C5 MOVW R24,R10
01E9 3180 CPI R24,0x10
01EA E0E0 LDI R30,0
01EB 079E CPC R25,R30
01EC F350 BCS 0x01D7
01ED 24AA CLR R10
01EE 24BB CLR R11
01EF C01B RJMP 0x020B
01F0 0195 MOVW R18,R10
01F1 5F2F SUBI R18,0xFF
01F2 4F3F SBCI R19,0xFF
01F3 E00E LDI R16,0xE
01F4 E010 LDI R17,0
01F5 940E082A CALL empy16s
01F7 0118 MOVW R2,R16
01F8 EE85 LDI R24,0xE5
01F9 E091 LDI R25,1
01FA 0E28 ADD R2,R24
01FB 1E39 ADC R3,R25
01FC E00E LDI R16,0xE
01FD E010 LDI R17,0
01FE 0195 MOVW R18,R10
01FF 940E082A CALL empy16s
0201 01F8 MOVW R30,R16
0202 EE87 LDI R24,0xE7
0203 E091 LDI R25,1
0204 0FE8 ADD R30,R24
0205 1FF9 ADC R31,R25
0206 8231 STD Z+1,R3
0207 8220 STD Z+0,R2
(0106) }
(0107) OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
0208 01C5 MOVW R24,R10
0209 9601 ADIW R24,1
020A 015C MOVW R10,R24
020B 01C5 MOVW R24,R10
020C 3085 CPI R24,5
020D E0E0 LDI R30,0
(0108) OSTCBFreeList = &OSTCBTbl[0];
020E 079E CPC R25,R30
020F F300 BCS 0x01F0
0210 2422 CLR R2
0211 2433 CLR R3
0212 9230022E STS 0x22E,R3
(0109)
(0110) #if OS_MAX_EVENTS >= 2
(0111) for (i = 0; i < (OS_MAX_EVENTS - 1); i++) { /* Init. list of free EVENT control blocks */
0214 9220022D STS 0x22D,R2
0216 EE85 LDI R24,0xE5
(0112) OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
0217 E091 LDI R25,1
0218 939002C7 STS OSTCBFreeList+1,R25
021A 938002C6 STS OSTCBFreeList,R24
021C 24AA CLR R10
021D 24BB CLR R11
021E C01B RJMP 0x023A
021F 0195 MOVW R18,R10
0220 5F2F SUBI R18,0xFF
0221 4F3F SBCI R19,0xFF
0222 E008 LDI R16,0x8
0223 E010 LDI R17,0
0224 940E082A CALL empy16s
0226 0118 MOVW R2,R16
0227 ED87 LDI R24,0xD7
0228 E092 LDI R25,2
0229 0E28 ADD R2,R24
022A 1E39 ADC R3,R25
022B E008 LDI R16,0x8
022C E010 LDI R17,0
022D 0195 MOVW R18,R10
022E 940E082A CALL empy16s
0230 01F8 MOVW R30,R16
0231 ED87 LDI R24,0xD7
0232 E092 LDI R25,2
0233 0FE8 ADD R30,R24
0234 1FF9 ADC R31,R25
0235 8231 STD Z+1,R3
0236 8220 STD Z+0,R2
(0113) }
(0114) OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
0237 01C5 MOVW R24,R10
0238 9601 ADIW R24,1
0239 015C MOVW R10,R24
023A 01C5 MOVW R24,R10
023B 3081 CPI R24,1
023C E0E0 LDI R30,0
(0115) OSEventFreeList = &OSEventTbl[0];
023D 079E CPC R25,R30
023E F300 BCS 0x021F
023F 2422 CLR R2
0240 2433 CLR R3
0241 923002E0 STS 0x2E0,R3
(0116) #endif
(0117)
(0118) #if OS_STK_GROWTH == 1
(0119) OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
0243 922002DF STS 0x2DF,R2
0245 ED87 LDI R24,0xD7
0246 E092 LDI R25,2
0247 939002E8 STS OSEventFreeList+1,R25
0249 938002E7 STS OSEventFreeList,R24
024B E08F LDI R24,0xF
024C 838A STD Y+2,R24
024D E98C LDI R24,0x9C
024E E092 LDI R25,2
024F 8399 STD Y+1,R25
0250 8388 STD Y+0,R24
0251 2722 CLR R18
(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();
0252 2733 CLR R19
0253 E900 LDI R16,0x90
0254 E010 LDI R17,0
0255 D32C RCALL _OSTaskCreate
0256 9623 ADIW R28,3
(0148) if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
0257 940E083A CALL pop_gset3x
0259 9508 RET
_OSIntExit:
025A 930A ST R16,-Y
025B B70F IN R16,0x3F
025C 94F8 BCLR 7
025D 930F PUSH R16
025E 9109 LD R16,Y+
025F 918002D2 LDS R24,OSIntNesting
0261 5081 SUBI R24,1
(0149) OSIntExitY = OSUnMapTbl[OSRdyGrp];
0262 2E28 MOV R2,R24
0263 922002D2 STS OSIntNesting,R2
0265 904002D1 LDS R4,OSLockNesting
0267 2824 OR R2,R4
0268 F009 BEQ 0x026A
0269 C050 RJMP 0x02BA
026A E98A LDI R24,0x9A
026B E090 LDI R25,0
(0150) OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
026C 91E002CE LDS R30,OSRdyGrp
026E 27FF CLR R31
026F 0FE8 ADD R30,R24
0270 1FF9 ADC R31,R25
0271 91E4 LPM R30,0(Z)
0272 93E0029D STS 0x29D,R30
0274 EC8C LDI R24,0xCC
0275 E092 LDI R25,2
0276 27FF CLR R31
0277 0FE8 ADD R30,R24
0278 1FF9 ADC R31,R25
0279 81E0 LDD R30,Z+0
027A 27FF CLR R31
027B E98A LDI R24,0x9A
027C E090 LDI R25,0
027D 0FE8 ADD R30,R24
027E 1FF9 ADC R31,R25
027F 9024 LPM R2,0(Z)
0280 2433 CLR R3
0281 9040029D LDS R4,0x29D
0283 2455 CLR R5
0284 0C44 LSL R4
0285 1C55 ROL R5
(0151) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
0286 0C44 LSL R4
0287 1C55 ROL R5
0288 0C44 LSL R4
0289 1C55 ROL R5
(0152) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
028A 0C42 ADD R4,R2
028B 1C53 ADC R5,R3
028C 924002CF STS OSPrioHighRdy,R4
028E 902002D0 LDS R2,OSPrioCur
0290 1442 CP R4,R2
0291 F141 BEQ 0x02BA
0292 2C24 MOV R2,R4
0293 E082 LDI R24,2
0294 9D82 MUL R24,R2
0295 01F0 MOVW R30,R0
0296 EA82 LDI R24,0xA2
0297 E092 LDI R25,2
(0153) OSCtxSwCtr++; /* Keep track of the number of context switches */
0298 0FE8 ADD R30,R24
0299 1FF9 ADC R31,R25
029A 8020 LDD R2,Z+0
029B 8031 LDD R3,Z+1
029C 923002C5 STS OSTCBHighRdy+1,R3
029E 922002C4 STS OSTCBHighRdy,R2
02A0 E081 LDI R24,1
02A1 E090 LDI R25,0
02A2 E0A0 LDI R26,0
02A3 E0B0 LDI R27,0
02A4 904002EB LDS R4,OSCtxSwCtr+2
02A6 905002EC LDS R5,OSCtxSwCtr+3
02A8 902002E9 LDS R2,OSCtxSwCtr
02AA 903002EA LDS R3,OSCtxSwCtr+1
02AC 0E28 ADD R2,R24
02AD 1E39 ADC R3,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -