test.lst
来自「uCOS-II工程文件,使用ICC编译。」· LST 代码 · 共 1,555 行 · 第 1/5 页
LST
1,555 行
03EB 940E0D10 CALL _OS_CPU_SR_Restore
(0417) OS_Sched(); /* See if a HPT is ready */
03ED D2CE RCALL _OS_Sched
(0418) } else {
03EE C00B RJMP 0x03FA
(0419) OS_EXIT_CRITICAL();
03EF 2F04 MOV R16,R20
03F0 940E0D10 CALL _OS_CPU_SR_Restore
(0420) }
(0421) } else {
03F2 C007 RJMP 0x03FA
(0422) OS_EXIT_CRITICAL();
03F3 2F04 MOV R16,R20
03F4 940E0D10 CALL _OS_CPU_SR_Restore
(0423) }
(0424) } else {
03F6 C003 RJMP 0x03FA
(0425) OS_EXIT_CRITICAL();
03F7 2F04 MOV R16,R20
03F8 940E0D10 CALL _OS_CPU_SR_Restore
(0426) }
(0427) }
03FA 940E12ED CALL pop_gset1
03FC 9508 RET
_OSStart:
x --> R22
y --> R20
03FD 940E12E8 CALL push_gset2
(0428) }
(0429) #endif
(0430)
(0431) /*$PAGE*/
(0432) /*
(0433) *********************************************************************************************************
(0434) * START MULTITASKING
(0435) *
(0436) * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
(0437) * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
(0438) * and you MUST have created at least one task.
(0439) *
(0440) * Arguments : none
(0441) *
(0442) * Returns : none
(0443) *
(0444) * Note : OSStartHighRdy() MUST:
(0445) * a) Call OSTaskSwHook() then,
(0446) * b) Set OSRunning to TRUE.
(0447) * c) Load the context of the task pointed to by OSTCBHighRdy.
(0448) * d_ Execute the task.
(0449) *********************************************************************************************************
(0450) */
(0451)
(0452) void OSStart (void)
(0453) {
(0454) INT8U y;
(0455) INT8U x;
(0456)
(0457)
(0458) if (OSRunning == FALSE) {
03FF 90200201 LDS R2,OSRunning
0401 2022 TST R2
0402 F009 BEQ 0x0404
0403 C039 RJMP 0x043D
(0459) y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
0404 E688 LDI R24,0x68
0405 E090 LDI R25,0
0406 91E00203 LDS R30,OSRdyGrp
0408 27FF CLR R31
0409 0FE8 ADD R30,R24
040A 1FF9 ADC R31,R25
040B 9144 LPM R20,0(Z)
(0460) x = OSUnMapTbl[OSRdyTbl[y]];
040C E082 LDI R24,2
040D E092 LDI R25,2
040E 2FE4 MOV R30,R20
040F 27FF CLR R31
0410 0FE8 ADD R30,R24
0411 1FF9 ADC R31,R25
0412 81E0 LDD R30,Z+0
0413 27FF CLR R31
0414 E688 LDI R24,0x68
0415 E090 LDI R25,0
0416 0FE8 ADD R30,R24
0417 1FF9 ADC R31,R25
0418 9164 LPM R22,0(Z)
(0461) OSPrioHighRdy = (INT8U)((y << 3) + x);
0419 2E26 MOV R2,R22
041A 2433 CLR R3
041B 2E44 MOV R4,R20
041C 2455 CLR R5
041D 0C44 LSL R4
041E 1C55 ROL R5
041F 0C44 LSL R4
0420 1C55 ROL R5
0421 0C44 LSL R4
0422 1C55 ROL R5
0423 0C42 ADD R4,R2
0424 1C53 ADC R5,R3
0425 92400204 STS OSPrioHighRdy,R4
(0462) OSPrioCur = OSPrioHighRdy;
0427 2C24 MOV R2,R4
0428 92200205 STS OSPrioCur,R2
(0463) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
042A E082 LDI R24,2
042B 9D82 MUL R24,R2
042C 01F0 MOVW R30,R0
042D E882 LDI R24,0x82
042E E091 LDI R25,1
042F 0FE8 ADD R30,R24
0430 1FF9 ADC R31,R25
0431 8020 LDD R2,Z+0
0432 8031 LDD R3,Z+1
0433 92300193 STS OSTCBHighRdy+1,R3
0435 92200192 STS OSTCBHighRdy,R2
(0464) OSTCBCur = OSTCBHighRdy;
0437 92300197 STS OSTCBCur+1,R3
0439 92200196 STS OSTCBCur,R2
(0465) OSStartHighRdy(); /* Execute target specific code to start task */
043B 940E0D12 CALL _OSStartHighRdy
(0466) }
043D 940E12D6 CALL pop_gset2
043F 9508 RET
_OSStatInit:
cpu_sr --> R10
0440 940E12E6 CALL push_gset3
(0467) }
(0468) /*$PAGE*/
(0469) /*
(0470) *********************************************************************************************************
(0471) * STATISTICS INITIALIZATION
(0472) *
(0473) * Description: This function is called by your application to establish CPU usage by first determining
(0474) * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
(0475) * during that time. CPU usage is then determined by a low priority task which keeps track
(0476) * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
(0477) * determined by:
(0478) *
(0479) * OSIdleCtr
(0480) * CPU Usage (%) = 100 * (1 - ------------)
(0481) * OSIdleCtrMax
(0482) *
(0483) * Arguments : none
(0484) *
(0485) * Returns : none
(0486) *********************************************************************************************************
(0487) */
(0488)
(0489) #if OS_TASK_STAT_EN > 0
(0490) void OSStatInit (void)
(0491) {
(0492) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0493) OS_CPU_SR cpu_sr;
(0494) #endif
(0495)
(0496)
(0497) OSTimeDly(2); /* Synchronize with clock tick */
0442 E002 LDI R16,2
0443 E010 LDI R17,0
0444 D7CA RCALL _OSTimeDly
(0498) OS_ENTER_CRITICAL();
0445 940E0D0D CALL _OS_CPU_SR_Save
(0499) OSIdleCtr = 0L; /* Clear idle counter */
0447 E040 LDI R20,0
0448 E050 LDI R21,0
0449 E060 LDI R22,0
044A E070 LDI R23,0
044B 935001FD STS OSIdleCtr+1,R21
044D 934001FC STS OSIdleCtr,R20
044F 937001FF STS OSIdleCtr+3,R23
0451 936001FE STS OSIdleCtr+2,R22
(0500) OS_EXIT_CRITICAL();
0453 940E0D10 CALL _OS_CPU_SR_Restore
(0501) OSTimeDly(OS_TICKS_PER_SEC / 10); /* Determine MAX. idle counter value for 1/10 second */
0455 E005 LDI R16,5
0456 E010 LDI R17,0
0457 D7B7 RCALL _OSTimeDly
(0502) OS_ENTER_CRITICAL();
0458 940E0D0D CALL _OS_CPU_SR_Save
045A 2EA0 MOV R10,R16
(0503) OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
045B 904001FE LDS R4,OSIdleCtr+2
045D 905001FF LDS R5,OSIdleCtr+3
045F 902001FC LDS R2,OSIdleCtr
0461 903001FD LDS R3,OSIdleCtr+1
0463 92300273 STS OSIdleCtrMax+1,R3
0465 92200272 STS OSIdleCtrMax,R2
0467 92500275 STS OSIdleCtrMax+3,R5
0469 92400274 STS OSIdleCtrMax+2,R4
(0504) OSStatRdy = TRUE;
046B E081 LDI R24,1
046C 9380026D STS OSStatRdy,R24
(0505) OS_EXIT_CRITICAL();
046E 940E0D10 CALL _OS_CPU_SR_Restore
0470 940E12D9 CALL pop_gset3
0472 9508 RET
_OSTimeTick:
step --> R20
cpu_sr --> R20
ptcb --> R22
0473 940E12E8 CALL push_gset2
(0506) }
(0507) #endif
(0508) /*$PAGE*/
(0509) /*
(0510) *********************************************************************************************************
(0511) * PROCESS SYSTEM TICK
(0512) *
(0513) * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
(0514) * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
(0515) * called by a high priority task.
(0516) *
(0517) * Arguments : none
(0518) *
(0519) * Returns : none
(0520) *********************************************************************************************************
(0521) */
(0522)
(0523) void OSTimeTick (void)
(0524) {
(0525) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0526) OS_CPU_SR cpu_sr;
(0527) #endif
(0528) OS_TCB *ptcb;
(0529) BOOLEAN step;
(0530)
(0531)
(0532) #if OS_TIME_TICK_HOOK_EN > 0
(0533) OSTimeTickHook(); /* Call user definable hook */
0475 940E0F1C CALL _OSTimeTickHook
(0534) #endif
(0535) #if OS_TIME_GET_SET_EN > 0
(0536) OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
(0537) OSTime++;
(0538) OS_EXIT_CRITICAL();
(0539) #endif
(0540) if (OSRunning == TRUE) {
0477 91800201 LDS R24,OSRunning
0479 3081 CPI R24,1
047A F009 BEQ 0x047C
047B C04A RJMP 0x04C6
(0541) #if OS_TICK_STEP_EN > 0
(0542) switch (OSTickStepState) { /* Determine whether we need to process a tick */
(0543) case OS_TICK_STEP_DIS: /* Yes, stepping is disabled */
(0544) step = TRUE;
(0545) break;
(0546)
(0547) case OS_TICK_STEP_WAIT: /* No, waiting for uC/OS-View to set ... */
(0548) step = FALSE; /* .. OSTickStepState to OS_TICK_STEP_ONCE */
(0549) break;
(0550)
(0551) case OS_TICK_STEP_ONCE: /* Yes, process tick once and wait for next ... */
(0552) step = TRUE; /* ... step command from uC/OS-View */
(0553) OSTickStepState = OS_TICK_STEP_WAIT;
(0554) break;
(0555)
(0556) default: /* Invalid case, correct situation */
(0557) step = TRUE;
(0558) OSTickStepState = OS_TICK_STEP_DIS;
(0559) break;
(0560) }
(0561) #else
(0562) step = TRUE;
047C E041 LDI R20,1
(0563) #endif
(0564) if (step == TRUE) {
047D 3041 CPI R20,1
047E F009 BEQ 0x0480
047F C046 RJMP 0x04C6
(0565) ptcb = OSTCBList; /* Point at first TCB in TCB list */
0480 91600190 LDS R22,OSTCBList
0482 91700191 LDS R23,OSTCBList+1
0484 C03C RJMP 0x04C1
(0566) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0567) OS_ENTER_CRITICAL();
0485 940E0D0D CALL _OS_CPU_SR_Save
0487 2F40 MOV R20,R16
(0568) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0488 01FB MOVW R30,R22
0489 8420 LDD R2,Z+8
048A 8431 LDD R3,Z+9
048B 2022 TST R2
048C F419 BNE 0x0490
048D 2033 TST R3
048E F409 BNE 0x0490
048F C02B RJMP 0x04BB
(0569) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
0490 01CB MOVW R24,R22
0491 9608 ADIW R24,0x8
0492 01FC MOVW R30,R24
0493 8180 LDD R24,Z+0
0494 8191 LDD R25,Z+1
0495 9701 SBIW R24,1
0496 012C MOVW R4,R24
0497 8251 STD Z+1,R5
0498 8240 STD Z+0,R4
0499 3080 CPI R24,0
049A 0789 CPC R24,R25
049B F009 BEQ 0x049D
049C C01E RJMP 0x04BB
(0570) if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
049D 01FB MOVW R30,R22
049E 8422 LDD R2,Z+10
049F FC23 SBRC R2,3
04A0 C015 RJMP 0x04B6
(0571) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
04A1 01FB MOVW R30,R22
04A2 8427 LDD R2,Z+15
04A3 90300203 LDS R3,OSRdyGrp
04A5 2832 OR R3,R2
04A6 92300203 STS OSRdyGrp,R3
(0572) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?