📄 ucos.lst
字号:
0232 9180040C LDS R24,OSLockNesting
0234 3F8F CPI R24,0xFF
0235 F418 BCC 0x0239
0236 5F8F SUBI R24,0xFF
(0346) if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
0237 9380040C STS OSLockNesting,R24
0239 2F04 MOV R16,R20
023A 940E06D7 CALL _OS_CPU_SR_Restore
(0347) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
023C 940E09D6 CALL pop_gset1
023E 9508 RET
_OSSchedUnlock:
cpu_sr --> R20
023F 940E09D3 CALL push_gset1
0241 2744 CLR R20
0242 91800406 LDS R24,OSRunning
0244 3081 CPI R24,1
0245 F509 BNE 0x0267
0246 940E06D4 CALL _OS_CPU_SR_Save
0248 2F40 MOV R20,R16
0249 2422 CLR R2
(0348) #if OS_TASK_PROFILE_EN > 0
(0349) OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
024A 9030040C LDS R3,OSLockNesting
024C 1423 CP R2,R3
024D F4B0 BCC 0x0264
024E 2D83 MOV R24,R3
024F 5081 SUBI R24,1
0250 9380040C STS OSLockNesting,R24
0252 2388 TST R24
0253 F461 BNE 0x0260
0254 9020040D LDS R2,OSIntNesting
0256 2022 TST R2
0257 F421 BNE 0x025C
0258 940E06D7 CALL _OS_CPU_SR_Restore
025A D151 RCALL _OS_Sched
025B C00B RJMP 0x0267
025C 2F04 MOV R16,R20
(0350) #endif
(0351) OSCtxSwCtr++; /* Keep track of the number of ctx switches */
025D 940E06D7 CALL _OS_CPU_SR_Restore
025F C007 RJMP 0x0267
0260 2F04 MOV R16,R20
0261 940E06D7 CALL _OS_CPU_SR_Restore
0263 C003 RJMP 0x0267
0264 2F04 MOV R16,R20
0265 940E06D7 CALL _OS_CPU_SR_Restore
0267 940E09D6 CALL pop_gset1
0269 9508 RET
_OSStart:
x --> R22
y --> R20
026A 940E09D1 CALL push_gset2
026C 90200406 LDS R2,OSRunning
026E 2022 TST R2
026F F009 BEQ 0x0271
0270 C039 RJMP 0x02AA
0271 E98C LDI R24,0x9C
0272 E090 LDI R25,0
0273 91E00409 LDS R30,OSRdyGrp
(0352) OSIntCtxSw(); /* Perform interrupt level ctx switch */
0275 27FF CLR R31
0276 0FE8 ADD R30,R24
(0353) }
(0354) }
(0355) }
(0356) OS_EXIT_CRITICAL();
0277 1FF9 ADC R31,R25
0278 9144 LPM R20,0(Z)
0279 E087 LDI R24,7
(0357) }
027A E094 LDI R25,4
027B 2FE4 MOV R30,R20
027C 27FF CLR R31
027D 0FE8 ADD R30,R24
027E 1FF9 ADC R31,R25
(0358) }
(0359) /*$PAGE*/
(0360) /*
(0361) *********************************************************************************************************
(0362) * PREVENT SCHEDULING
(0363) *
(0364) * Description: This function is used to prevent rescheduling to take place. This allows your application
(0365) * to prevent context switches until you are ready to permit context switching.
(0366) *
(0367) * Arguments : none
(0368) *
(0369) * Returns : none
(0370) *
(0371) * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
(0372) * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
(0373) *********************************************************************************************************
(0374) */
(0375)
(0376) #if OS_SCHED_LOCK_EN > 0
(0377) void OSSchedLock (void)
(0378) {
(0379) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0380) OS_CPU_SR cpu_sr;
(0381)
(0382)
(0383)
(0384) cpu_sr = 0; /* Prevent compiler warning */
027F 81E0 LDD R30,Z+0
(0385) #endif
(0386) if (OSRunning == TRUE) { /* Make sure multitasking is running */
0280 27FF CLR R31
0281 E98C LDI R24,0x9C
0282 E090 LDI R25,0
0283 0FE8 ADD R30,R24
(0387) OS_ENTER_CRITICAL();
0284 1FF9 ADC R31,R25
0285 9164 LPM R22,0(Z)
0286 2E26 MOV R2,R22
(0388) if (OSLockNesting < 255u) { /* Prevent OSLockNesting from wrapping back to 0 */
0287 2433 CLR R3
0288 2E44 MOV R4,R20
0289 2455 CLR R5
028A 0C44 LSL R4
(0389) OSLockNesting++; /* Increment lock nesting level */
028B 1C55 ROL R5
028C 0C44 LSL R4
028D 1C55 ROL R5
(0390) }
(0391) OS_EXIT_CRITICAL();
028E 0C44 LSL R4
028F 1C55 ROL R5
0290 0C42 ADD R4,R2
(0392) }
0291 1C53 ADC R5,R3
0292 9240040A STS OSPrioHighRdy,R4
0294 2C24 MOV R2,R4
0295 9220040B STS OSPrioCur,R2
(0393) }
(0394) #endif
(0395)
(0396) /*$PAGE*/
(0397) /*
(0398) *********************************************************************************************************
(0399) * ENABLE SCHEDULING
(0400) *
(0401) * Description: This function is used to re-allow rescheduling.
(0402) *
(0403) * Arguments : none
(0404) *
(0405) * Returns : none
(0406) *
(0407) * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
(0408) * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
(0409) *********************************************************************************************************
(0410) */
(0411)
(0412) #if OS_SCHED_LOCK_EN > 0
(0413) void OSSchedUnlock (void)
(0414) {
(0415) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0416) OS_CPU_SR cpu_sr;
(0417)
(0418)
(0419)
(0420) cpu_sr = 0; /* Prevent compiler warning */
0297 E082 LDI R24,2
0298 9D82 MUL R24,R2
0299 01F0 MOVW R30,R0
029A E687 LDI R24,0x67
(0421) #endif
(0422) if (OSRunning == TRUE) { /* Make sure multitasking is running */
(0423) OS_ENTER_CRITICAL();
029B E093 LDI R25,3
029C 0FE8 ADD R30,R24
029D 1FF9 ADC R31,R25
(0424) if (OSLockNesting > 0) { /* Do not decrement if already 0 */
029E 8020 LDD R2,Z+0
029F 8031 LDD R3,Z+1
02A0 9230037C STS OSTCBHighRdy+1,R3
02A2 9220037B STS OSTCBHighRdy,R2
(0425) OSLockNesting--; /* Decrement lock nesting level */
02A4 92300380 STS OSTCBCur+1,R3
02A6 9220037F STS OSTCBCur,R2
(0426) if (OSLockNesting == 0) { /* See if scheduler is enabled and ... */
02A8 940E06D9 CALL _OSStartHighRdy
(0427) if (OSIntNesting == 0) { /* ... not in an ISR */
02AA 940E09BF CALL pop_gset2
02AC 9508 RET
(0428) OS_EXIT_CRITICAL();
_OSTimeTick:
cpu_sr --> R20
ptcb --> R22
02AD 940E09D1 CALL push_gset2
(0429) OS_Sched(); /* See if a HPT is ready */
02AF 2744 CLR R20
(0430) } else {
02B0 91800406 LDS R24,OSRunning
(0431) OS_EXIT_CRITICAL();
02B2 3081 CPI R24,1
02B3 F009 BEQ 0x02B5
(0432) }
(0433) } else {
02B4 C051 RJMP 0x0306
(0434) OS_EXIT_CRITICAL();
02B5 91600379 LDS R22,OSTCBList
02B7 9170037A LDS R23,OSTCBList+1
(0435) }
(0436) } else {
02B9 C047 RJMP 0x0301
02BA 940E06D4 CALL _OS_CPU_SR_Save
(0437) OS_EXIT_CRITICAL();
(0438) }
(0439) }
02BC 2F40 MOV R20,R16
02BD 01FB MOVW R30,R22
02BE 8026 LDD R2,Z+6
02BF 8037 LDD R3,Z+7
02C0 2022 TST R2
(0440) }
(0441) #endif
(0442)
(0443) /*$PAGE*/
(0444) /*
(0445) *********************************************************************************************************
(0446) * START MULTITASKING
(0447) *
(0448) * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
(0449) * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
(0450) * and you MUST have created at least one task.
(0451) *
(0452) * Arguments : none
(0453) *
(0454) * Returns : none
(0455) *
(0456) * Note : OSStartHighRdy() MUST:
(0457) * a) Call OSTaskSwHook() then,
(0458) * b) Set OSRunning to TRUE.
(0459) * c) Load the context of the task pointed to by OSTCBHighRdy.
(0460) * d_ Execute the task.
(0461) *********************************************************************************************************
(0462) */
(0463)
(0464) void OSStart (void)
(0465) {
(0466) INT8U y;
(0467) INT8U x;
(0468)
(0469)
(0470) if (OSRunning == FALSE) {
02C1 F419 BNE 0x02C5
02C2 2033 TST R3
02C3 F409 BNE 0x02C5
02C4 C036 RJMP 0x02FB
02C5 01CB MOVW R24,R22
(0471) y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
02C6 9606 ADIW R24,6
02C7 01FC MOVW R30,R24
02C8 8180 LDD R24,Z+0
02C9 8191 LDD R25,Z+1
02CA 9701 SBIW R24,1
02CB 012C MOVW R4,R24
02CC 8251 STD Z+1,R5
02CD 8240 STD Z+0,R4
(0472) x = OSUnMapTbl[OSRdyTbl[y]];
02CE 3080 CPI R24,0
02CF 0789 CPC R24,R25
02D0 F009 BEQ 0x02D2
02D1 C029 RJMP 0x02FB
02D2 01FB MOVW R30,R22
02D3 8580 LDD R24,Z+8
02D4 7387 ANDI R24,0x37
02D5 F051 BEQ 0x02E0
02D6 01CB MOVW R24,R22
02D7 9608 ADIW R24,0x8
02D8 01FC MOVW R30,R24
02D9 8180 LDD R24,Z+0
02DA 7C88 ANDI R24,0xC8
(0473) OSPrioHighRdy = (INT8U)((y << 3) + x);
02DB 8380 STD Z+0,R24
02DC E081 LDI R24,1
02DD 01FB MOVW R30,R22
02DE 8781 STD Z+9,R24
02DF C003 RJMP 0x02E3
02E0 2422 CLR R2
02E1 01FB MOVW R30,R22
02E2 8621 STD Z+9,R2
02E3 01FB MOVW R30,R22
02E4 8420 LDD R2,Z+8
02E5 FC23 SBRC R2,3
02E6 C014 RJMP 0x02FB
02E7 01FB MOVW R30,R22
02E8 8426 LDD R2,Z+14
(0474) OSPrioCur = OSPrioHighRdy;
02E9 90300409 LDS R3,OSRdyGrp
02EB 2832 OR R3,R2
(0475) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
02EC 92300409 STS OSRdyGrp,R3
02EE E087 LDI R24,7
02EF E094 LDI R25,4
02F0 01FB MOVW R30,R22
02F1 8424 LDD R2,Z+12
02F2 2433 CLR R3
02F3 0E28 ADD R2,R24
02F4 1E39 ADC R3,R25
02F5 01FB MOVW R30,R22
02F6 8445 LDD R4,Z+13
02F7 01F1 MOVW R30,R2
02F8 8050 LDD R5,Z+0
(0476) OSTCBCur = OSTCBHighRdy;
02F9 2854 OR R5,R4
02FA 8250 STD Z+0,R5
02FB 01FB MOVW R30,R22
02FC 8162 LDD R22,Z+2
(0477) OSStartHighRdy(); /* Execute target specific code to start task */
02FD 8173 LDD R23,Z+3
02FE 2F04 MOV R16,R20
(0478) }
02FF 940E06D7 CALL _OS_CPU_SR_Restore
0301 01FB MOVW R30,R22
0302 8582 LDD R24,Z+10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -