📄 ucos.lst
字号:
(0037) *
(0038) * Note: Index into table is bit pattern to resolve highest priority
(0039) * Indexed value corresponds to highest priority bit position (i.e. 0..7)
(0040) *********************************************************************************************************
(0041) */
(0042)
(0043) INT8U const OSUnMapTbl[] = {
(0044) 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0045) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0046) 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0047) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0048) 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0049) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0050) 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0051) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0052) 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0053) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0054) 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0055) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0056) 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0057) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0058) 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
(0059) 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
(0060) };
(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 */
0197 E080 LDI R24,0
0198 E090 LDI R25,0
0199 E0A0 LDI R26,0
019A E0B0 LDI R27,0
019B 939002A9 STS OSTime+1,R25
019D 938002A8 STS OSTime,R24
019F 93B002AB STS OSTime+3,R27
01A1 93A002AA STS OSTime+2,R26
(0082) OSIntNesting = 0; /* Clear the interrupt nesting counter */
01A3 2422 CLR R2
01A4 922002DC STS OSIntNesting,R2
(0083) OSLockNesting = 0; /* Clear the scheduling lock counter */
01A6 922002DB STS OSLockNesting,R2
(0084) #if OS_TASK_CREATE_EN || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
(0085) OSTaskCtr = 0; /* Clear the number of tasks */
01A8 922002D4 STS OSTaskCtr,R2
(0086) #endif
(0087) OSRunning = FALSE; /* Indicate that multitasking not started */
01AA 922002D5 STS OSRunning,R2
(0088) OSIdleCtr = 0L; /* Clear the 32-bit idle counter */
01AC E080 LDI R24,0
01AD E090 LDI R25,0
01AE E0A0 LDI R26,0
01AF E0B0 LDI R27,0
01B0 939002DE STS OSIdleCtr+1,R25
01B2 938002DD STS OSIdleCtr,R24
01B4 93B002E0 STS OSIdleCtr+3,R27
01B6 93A002DF STS OSIdleCtr+2,R26
(0089)
(0090) OSCtxSwCtr = 0; /* Clear the context switch counter */
01B8 E080 LDI R24,0
01B9 E090 LDI R25,0
01BA E0A0 LDI R26,0
01BB E0B0 LDI R27,0
01BC 939002F4 STS OSCtxSwCtr+1,R25
01BE 938002F3 STS OSCtxSwCtr,R24
01C0 93B002F6 STS OSCtxSwCtr+3,R27
01C2 93A002F5 STS OSCtxSwCtr+2,R26
(0091) OSRdyGrp = 0; /* Clear the ready list */
01C4 922002D8 STS OSRdyGrp,R2
(0092) for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
01C6 24AA CLR R10
01C7 24BB CLR R11
01C8 C00A RJMP 0x01D3
(0093) OSRdyTbl[i] = 0;
01C9 ED86 LDI R24,0xD6
01CA E092 LDI R25,2
01CB 01F5 MOVW R30,R10
01CC 0FE8 ADD R30,R24
01CD 1FF9 ADC R31,R25
01CE 2422 CLR R2
01CF 8220 STD Z+0,R2
01D0 01C5 MOVW R24,R10
01D1 9601 ADIW R24,1
01D2 015C MOVW R10,R24
01D3 01C5 MOVW R24,R10
01D4 3082 CPI R24,2
01D5 E0E0 LDI R30,0
01D6 079E CPC R25,R30
01D7 F388 BCS 0x01C9
(0094) }
(0095)
(0096) OSPrioCur = 0;
01D8 2422 CLR R2
01D9 922002DA STS OSPrioCur,R2
(0097) OSPrioHighRdy = 0;
01DB 922002D9 STS OSPrioHighRdy,R2
(0098) OSTCBHighRdy = (OS_TCB *)0; /* TCB Initialization */
01DD 2433 CLR R3
01DE 923002CF STS OSTCBHighRdy+1,R3
01E0 922002CE STS OSTCBHighRdy,R2
(0099) OSTCBCur = (OS_TCB *)0;
01E2 923002D3 STS OSTCBCur+1,R3
01E4 922002D2 STS OSTCBCur,R2
(0100) OSTCBList = (OS_TCB *)0;
01E6 923002CD STS OSTCBList+1,R3
01E8 922002CC STS OSTCBList,R2
(0101) for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) { /* Clear the priority table */
01EA 24AA CLR R10
01EB 24BB CLR R11
01EC C011 RJMP 0x01FE
(0102) OSTCBPrioTbl[i] = (OS_TCB *)0;
01ED E002 LDI R16,2
01EE E010 LDI R17,0
01EF 0195 MOVW R18,R10
01F0 940E076D CALL empy16s
01F2 01F8 MOVW R30,R16
01F3 EA8C LDI R24,0xAC
01F4 E092 LDI R25,2
01F5 0FE8 ADD R30,R24
01F6 1FF9 ADC R31,R25
01F7 2422 CLR R2
01F8 2433 CLR R3
01F9 8231 STD Z+1,R3
01FA 8220 STD Z+0,R2
01FB 01C5 MOVW R24,R10
01FC 9601 ADIW R24,1
01FD 015C MOVW R10,R24
01FE 01C5 MOVW R24,R10
01FF 3180 CPI R24,0x10
0200 E0E0 LDI R30,0
0201 079E CPC R25,R30
0202 F350 BCS 0x01ED
(0103) }
(0104) for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs */
0203 24AA CLR R10
0204 24BB CLR R11
0205 C01B RJMP 0x0221
(0105) OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
0206 0195 MOVW R18,R10
0207 5F2F SUBI R18,0xFF
0208 4F3F SBCI R19,0xFF
0209 E00E LDI R16,0xE
020A E010 LDI R17,0
020B 940E076D CALL empy16s
020D 0118 MOVW R2,R16
020E EE8F LDI R24,0xEF
020F E091 LDI R25,1
0210 0E28 ADD R2,R24
0211 1E39 ADC R3,R25
0212 E00E LDI R16,0xE
0213 E010 LDI R17,0
0214 0195 MOVW R18,R10
0215 940E076D CALL empy16s
0217 01F8 MOVW R30,R16
0218 EF81 LDI R24,0xF1
0219 E091 LDI R25,1
021A 0FE8 ADD R30,R24
021B 1FF9 ADC R31,R25
021C 8231 STD Z+1,R3
021D 8220 STD Z+0,R2
021E 01C5 MOVW R24,R10
021F 9601 ADIW R24,1
0220 015C MOVW R10,R24
0221 01C5 MOVW R24,R10
0222 3085 CPI R24,5
0223 E0E0 LDI R30,0
0224 079E CPC R25,R30
0225 F300 BCS 0x0206
(0106) }
(0107) OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
0226 2422 CLR R2
0227 2433 CLR R3
0228 92300238 STS 0x238,R3
022A 92200237 STS 0x237,R2
(0108) OSTCBFreeList = &OSTCBTbl[0];
022C EE8F LDI R24,0xEF
022D E091 LDI R25,1
022E 939002D1 STS OSTCBFreeList+1,R25
0230 938002D0 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 */
0232 24AA CLR R10
0233 24BB CLR R11
0234 C01B RJMP 0x0250
(0112) OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
0235 0195 MOVW R18,R10
0236 5F2F SUBI R18,0xFF
0237 4F3F SBCI R19,0xFF
0238 E008 LDI R16,0x8
0239 E010 LDI R17,0
023A 940E076D CALL empy16s
023C 0118 MOVW R2,R16
023D EE81 LDI R24,0xE1
023E E092 LDI R25,2
023F 0E28 ADD R2,R24
0240 1E39 ADC R3,R25
0241 E008 LDI R16,0x8
0242 E010 LDI R17,0
0243 0195 MOVW R18,R10
0244 940E076D CALL empy16s
0246 01F8 MOVW R30,R16
0247 EE81 LDI R24,0xE1
0248 E092 LDI R25,2
0249 0FE8 ADD R30,R24
024A 1FF9 ADC R31,R25
024B 8231 STD Z+1,R3
024C 8220 STD Z+0,R2
024D 01C5 MOVW R24,R10
024E 9601 ADIW R24,1
024F 015C MOVW R10,R24
0250 01C5 MOVW R24,R10
0251 3081 CPI R24,1
0252 E0E0 LDI R30,0
0253 079E CPC R25,R30
0254 F300 BCS 0x0235
(0113) }
(0114) OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
0255 2422 CLR R2
0256 2433 CLR R3
0257 923002EA STS 0x2EA,R3
0259 922002E9 STS 0x2E9,R2
(0115) OSEventFreeList = &OSEventTbl[0];
025B EE81 LDI R24,0xE1
025C E092 LDI R25,2
025D 939002F2 STS OSEventFreeList+1,R25
025F 938002F1 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);
0261 E08F LDI R24,0xF
0262 838A STD Y+2,R24
0263 EA86 LDI R24,0xA6
0264 E092 LDI R25,2
0265 8399 STD Y+1,R25
0266 8388 STD Y+0,R24
0267 2722 CLR R18
0268 2733 CLR R19
0269 E900 LDI R16,0x90
026A E010 LDI R17,0
026B D32C RCALL _OSTaskCreate
026C 9623 ADIW R28,3
026D 940E077D CALL pop_gset3x
026F 9508 RET
(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();
_OSIntExit:
0270 930A ST R16,-Y
0271 B70F IN R16,0x3F
0272 94F8 BCLR 7
0273 930F PUSH R16
0274 9109 LD R16,Y+
(0148) if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
0275 918002DC LDS R24,OSIntNesting
0277 5081 SUBI R24,1
0278 2E28 MOV R2,R24
0279 922002DC STS OSIntNesting,R2
027B 904002DB LDS R4,OSLockNesting
027D 2824 OR R2,R4
027E F009 BEQ 0x0280
027F C050 RJMP 0x02D0
(0149) OSIntExitY = OSUnMapTbl[OSRdyGrp];
0280 E98A LDI R24,0x9A
0281 E090 LDI R25,0
0282 91E002D8 LDS R30,OSRdyGrp
0284 27FF CLR R31
0285 0FE8 ADD R30,R24
0286 1FF9 ADC R31,R25
0287 91E4 LPM R30,0(Z)
0288 93E002A7 STS OSIntExitY,R30
(0150) OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
028A ED86 LDI R24,0xD6
028B E092 LDI R25,2
028C 27FF CLR R31
028D 0FE8 ADD R30,R24
028E 1FF9 ADC R31,R25
028F 81E0 LDD R30,Z+0
0290 27FF CLR R31
0291 E98A LDI R24,0x9A
0292 E090 LDI R25,0
0293 0FE8 ADD R30,R24
0294 1FF9 ADC R31,R25
0295 9024 LPM R2,0(Z)
0296 2433 CLR R3
0297 904002A7 LDS R4,OSIntExitY
0299 2455 CLR R5
029A 0C44 LSL R4
029B 1C55 ROL R5
029C 0C44 LSL R4
029D 1C55 ROL R5
029E 0C44 LSL R4
029F 1C55 ROL R5
02A0 0C42 ADD R4,R2
02A1 1C53 ADC R5,R3
02A2 924002D9 STS OSPrioHighRdy,R4
(0151) if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
02A4 902002DA LDS R2,OSPrioCur
02A6 1442 CP R4,R2
02A7 F141 BEQ 0x02D0
(0152) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
02A8 2C24 MOV R2,R4
02A9 E082 LDI R24,2
02AA 9D82 MUL R24,R2
02AB 01F0 MOVW R30,R0
02AC EA8C LDI R24,0xAC
02AD E092 LDI R25,2
02AE 0FE8 ADD R30,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -