📄 test.lst
字号:
(0418) } else {
01ED C00B RJMP 0x01F9
(0419) OS_EXIT_CRITICAL();
01EE 2F04 MOV R16,R20
01EF 940E09FF CALL _OS_CPU_SR_Restore
(0420) }
(0421) } else {
01F1 C007 RJMP 0x01F9
(0422) OS_EXIT_CRITICAL();
01F2 2F04 MOV R16,R20
01F3 940E09FF CALL _OS_CPU_SR_Restore
(0423) }
(0424) } else {
01F5 C003 RJMP 0x01F9
(0425) OS_EXIT_CRITICAL();
01F6 2F04 MOV R16,R20
01F7 940E09FF CALL _OS_CPU_SR_Restore
(0426) }
(0427) }
01F9 940E0E1B CALL pop_gset1
01FB 9508 RET
_OSStart:
x --> R22
y --> R20
01FC 940E0E16 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) {
01FE 9020030D LDS R2,OSRunning
0200 2022 TST R2
0201 F009 BEQ 0x0203
0202 C039 RJMP 0x023C
(0459) y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
0203 E98C LDI R24,0x9C
0204 E090 LDI R25,0
0205 91E00310 LDS R30,OSRdyGrp
0207 27FF CLR R31
0208 0FE8 ADD R30,R24
0209 1FF9 ADC R31,R25
020A 9144 LPM R20,0(Z)
(0460) x = OSUnMapTbl[OSRdyTbl[y]];
020B E08E LDI R24,0xE
020C E093 LDI R25,3
020D 2FE4 MOV R30,R20
020E 27FF CLR R31
020F 0FE8 ADD R30,R24
0210 1FF9 ADC R31,R25
0211 81E0 LDD R30,Z+0
0212 27FF CLR R31
0213 E98C LDI R24,0x9C
0214 E090 LDI R25,0
0215 0FE8 ADD R30,R24
0216 1FF9 ADC R31,R25
0217 9164 LPM R22,0(Z)
(0461) OSPrioHighRdy = (INT8U)((y << 3) + x);
0218 2E26 MOV R2,R22
0219 2433 CLR R3
021A 2E44 MOV R4,R20
021B 2455 CLR R5
021C 0C44 LSL R4
021D 1C55 ROL R5
021E 0C44 LSL R4
021F 1C55 ROL R5
0220 0C44 LSL R4
0221 1C55 ROL R5
0222 0C42 ADD R4,R2
0223 1C53 ADC R5,R3
0224 92400311 STS OSPrioHighRdy,R4
(0462) OSPrioCur = OSPrioHighRdy;
0226 2C24 MOV R2,R4
0227 92200312 STS OSPrioCur,R2
(0463) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
0229 E082 LDI R24,2
022A 9D82 MUL R24,R2
022B 01F0 MOVW R30,R0
022C EE8E LDI R24,0xEE
022D E091 LDI R25,1
022E 0FE8 ADD R30,R24
022F 1FF9 ADC R31,R25
0230 8020 LDD R2,Z+0
0231 8031 LDD R3,Z+1
0232 92300203 STS OSTCBHighRdy+1,R3
0234 92200202 STS OSTCBHighRdy,R2
(0464) OSTCBCur = OSTCBHighRdy;
0236 92300207 STS OSTCBCur+1,R3
0238 92200206 STS OSTCBCur,R2
(0465) OSStartHighRdy(); /* Execute target specific code to start task */
023A 940E0A01 CALL _OSStartHighRdy
(0466) }
023C 940E0E04 CALL pop_gset2
023E 9508 RET
_OSTimeTick:
step --> R20
cpu_sr --> R20
ptcb --> R22
023F 940E0E16 CALL push_gset2
(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 */
(0498) OS_ENTER_CRITICAL();
(0499) OSIdleCtr = 0L; /* Clear idle counter */
(0500) OS_EXIT_CRITICAL();
(0501) OSTimeDly(OS_TICKS_PER_SEC / 10); /* Determine MAX. idle counter value for 1/10 second */
(0502) OS_ENTER_CRITICAL();
(0503) OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
(0504) OSStatRdy = TRUE;
(0505) OS_EXIT_CRITICAL();
(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 */
0241 940E0C28 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) {
0243 9180030D LDS R24,OSRunning
0245 3081 CPI R24,1
0246 F009 BEQ 0x0248
0247 C04A RJMP 0x0292
(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;
0248 E041 LDI R20,1
(0563) #endif
(0564) if (step == TRUE) {
0249 3041 CPI R20,1
024A F009 BEQ 0x024C
024B C046 RJMP 0x0292
(0565) ptcb = OSTCBList; /* Point at first TCB in TCB list */
024C 91600200 LDS R22,OSTCBList
024E 91700201 LDS R23,OSTCBList+1
0250 C03C RJMP 0x028D
(0566) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0567) OS_ENTER_CRITICAL();
0251 940E09FC CALL _OS_CPU_SR_Save
0253 2F40 MOV R20,R16
(0568) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0254 01FB MOVW R30,R22
0255 8420 LDD R2,Z+8
0256 8431 LDD R3,Z+9
0257 2022 TST R2
0258 F419 BNE 0x025C
0259 2033 TST R3
025A F409 BNE 0x025C
025B C02B RJMP 0x0287
(0569) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
025C 01CB MOVW R24,R22
025D 9608 ADIW R24,0x8
025E 01FC MOVW R30,R24
025F 8180 LDD R24,Z+0
0260 8191 LDD R25,Z+1
0261 9701 SBIW R24,1
0262 012C MOVW R4,R24
0263 8251 STD Z+1,R5
0264 8240 STD Z+0,R4
0265 3080 CPI R24,0
0266 0789 CPC R24,R25
0267 F009 BEQ 0x0269
0268 C01E RJMP 0x0287
(0570) if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
0269 01FB MOVW R30,R22
026A 8422 LDD R2,Z+10
026B FC23 SBRC R2,3
026C C015 RJMP 0x0282
(0571) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
026D 01FB MOVW R30,R22
026E 8427 LDD R2,Z+15
026F 90300310 LDS R3,OSRdyGrp
0271 2832 OR R3,R2
0272 92300310 STS OSRdyGrp,R3
(0572) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0274 E08E LDI R24,0xE
0275 E093 LDI R25,3
0276 01FB MOVW R30,R22
0277 8425 LDD R2,Z+13
0278 2433 CLR R3
0279 0E28 ADD R2,R24
027A 1E39 ADC R3,R25
027B 01FB MOVW R30,R22
027C 8446 LDD R4,Z+14
027D 01F1 MOVW R30,R2
027E 8050 LDD R5,Z+0
027F 2854 OR R5,R4
0280 8250 STD Z+0,R5
(0573) } else { /* Yes, Leave 1 tick to prevent loosing the ... */
0281 C005 RJMP 0x0287
(0574) ptcb->OSTCBDly = 1; /* ... task when the suspension is removed. */
0282 E081 LDI R24,1
0283 E090 LDI R25,0
0284 01FB MOVW R30,R22
0285 8791 STD Z+9,R25
0286 8780 STD Z+8,R24
(0575) }
(0576) }
(0577) }
(0578) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
0287 01FB MOVW R30,R22
0288 8162 LDD R22,Z+2
0289 8173 LDD R23,Z+3
(0579) OS_EXIT_CRITICAL();
028A 2F04 MOV R16,R20
028B 940E09FF CALL _OS_CPU_SR_Restore
028D 01FB MOVW R30,R22
028E 8583 LDD R24,Z+11
028F 3088 CPI R24,0x8
0290 F009 BEQ 0x0292
0291 CFBF RJMP 0x0251
(0580) }
(0581) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -