📄 test.lst
字号:
(0417) OS_Sched(); /* See if a HPT is ready */
1BE D288 RCALL _OS_Sched
(0418) } else {
1BF C00B RJMP 0x01CB
(0419) OS_EXIT_CRITICAL();
1C0 2D0A MOV R16,R10
1C1 940E 0BBA CALL _OS_CPU_SR_Restore
(0420) }
(0421) } else {
1C3 C007 RJMP 0x01CB
(0422) OS_EXIT_CRITICAL();
1C4 2D0A MOV R16,R10
1C5 940E 0BBA CALL _OS_CPU_SR_Restore
(0423) }
(0424) } else {
1C7 C003 RJMP 0x01CB
(0425) OS_EXIT_CRITICAL();
1C8 2D0A MOV R16,R10
1C9 940E 0BBA CALL _OS_CPU_SR_Restore
(0426) }
(0427) }
1CB 90A9 LD R10,Y+
1CC 9508 RET
_OSStart:
x --> R12
y --> R10
1CD 92AA ST R10,-Y
1CE 92CA ST R12,-Y
(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) {
1CF 9020 0B3D LDS R2,OSRunning
1D1 2022 TST R2
1D2 F009 BEQ 0x01D4
1D3 C03A RJMP 0x020E
(0459) y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
1D4 E98C LDI R24,0x9C
1D5 E090 LDI R25,0
1D6 91E0 0B46 LDS R30,OSRdyGrp
1D8 27FF CLR R31
1D9 0FE8 ADD R30,R24
1DA 1FF9 ADC R31,R25
1DB 90A6 ELPM R10,2886(Z)
(0460) x = OSUnMapTbl[OSRdyTbl[y]];
1DC E38E LDI R24,0x3E
1DD E09B LDI R25,0xB
1DE 2DEA MOV R30,R10
1DF 27FF CLR R31
1E0 0FE8 ADD R30,R24
1E1 1FF9 ADC R31,R25
1E2 81E0 LDD R30,Z+0
1E3 27FF CLR R31
1E4 E98C LDI R24,0x9C
1E5 E090 LDI R25,0
1E6 0FE8 ADD R30,R24
1E7 1FF9 ADC R31,R25
1E8 90C6 ELPM R12,0(Z)
(0461) OSPrioHighRdy = (INT8U)((y << 3) + x);
1E9 2C2C MOV R2,R12
1EA 2433 CLR R3
1EB 2C4A MOV R4,R10
1EC 2455 CLR R5
1ED 0C44 LSL R4
1EE 1C55 ROL R5
1EF 0C44 LSL R4
1F0 1C55 ROL R5
1F1 0C44 LSL R4
1F2 1C55 ROL R5
1F3 0C42 ADD R4,R2
1F4 1C53 ADC R5,R3
1F5 9240 0B47 STS OSPrioHighRdy,R4
(0462) OSPrioCur = OSPrioHighRdy;
1F7 2C24 MOV R2,R4
1F8 9220 0B48 STS OSPrioCur,R2
(0463) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
1FA EB80 LDI R24,0xB0
1FB E099 LDI R25,0x9
1FC 2DE4 MOV R30,R4
1FD 27FF CLR R31
1FE 0FEE LSL R30
1FF 1FFF ROL R31
200 0FE8 ADD R30,R24
201 1FF9 ADC R31,R25
202 8020 LDD R2,Z+0
203 8031 LDD R3,Z+1
204 9230 0A33 STS OSTCBHighRdy+1,R3
206 9220 0A32 STS OSTCBHighRdy,R2
(0464) OSTCBCur = OSTCBHighRdy;
208 9230 0A37 STS OSTCBCur+1,R3
20A 9220 0A36 STS OSTCBCur,R2
(0465) OSStartHighRdy(); /* Execute target specific code to start task */
20C 940E 0BBC CALL _OSStartHighRdy
(0466) }
20E 90C9 LD R12,Y+
20F 90A9 LD R10,Y+
210 9508 RET
_OSTimeTick:
step --> R20
cpu_sr --> R10
ptcb --> R20
211 940E 0FC8 CALL push_xgsetF03C
(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 */
213 940E 0DE3 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) {
215 9180 0B3D LDS R24,OSRunning
217 3081 CPI R24,1
218 F009 BEQ 0x021A
219 C046 RJMP 0x0260
(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;
21A E041 LDI R20,1
(0563) #endif
(0564) if (step == TRUE) {
21B 3041 CPI R20,1
21C F009 BEQ 0x021E
21D C042 RJMP 0x0260
(0565) ptcb = OSTCBList; /* Point at first TCB in TCB list */
21E 9140 0A30 LDS R20,OSTCBList
220 9150 0A31 LDS R21,OSTCBList+1
222 C038 RJMP 0x025B
(0566) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0567) OS_ENTER_CRITICAL();
223 940E 0BB7 CALL _OS_CPU_SR_Save
225 2EA0 MOV R10,R16
(0568) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
226 01FA MOVW R30,R20
227 8420 LDD R2,Z+8
228 8431 LDD R3,Z+9
229 2022 TST R2
22A F419 BNE 0x022E
22B 2033 TST R3
22C F409 BNE 0x022E
22D C027 RJMP 0x0255
(0569) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
22E 01CF MOVW R24,R30
22F 9608 ADIW R24,0x8
230 01FC MOVW R30,R24
231 8160 LDD R22,Z+0
232 8171 LDD R23,Z+1
233 5061 SUBI R22,1
234 4070 SBCI R23,0
235 8371 STD Z+1,R23
236 8360 STD Z+0,R22
237 3060 CPI R22,0
238 0767 CPC R22,R23
239 F4D9 BNE 0x0255
(0570) if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
23A 01FA MOVW R30,R20
23B 8422 LDD R2,Z+10
23C FC23 SBRC R2,3
23D C012 RJMP 0x0250
(0571) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
23E 8427 LDD R2,Z+15
23F 9030 0B46 LDS R3,OSRdyGrp
241 2832 OR R3,R2
242 9230 0B46 STS OSRdyGrp,R3
(0572) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
244 E38E LDI R24,0x3E
245 E09B LDI R25,0xB
246 84C5 LDD R12,Z+13
247 24DD CLR R13
248 0EC8 ADD R12,R24
249 1ED9 ADC R13,R25
24A 8426 LDD R2,Z+14
24B 01F6 MOVW R30,R12
24C 8030 LDD R3,Z+0
24D 2832 OR R3,R2
24E 8230 STD Z+0,R3
(0573) } else { /* Yes, Leave 1 tick to prevent loosing the ... */
24F C005 RJMP 0x0255
(0574) ptcb->OSTCBDly = 1; /* ... task when the suspension is removed. */
250 E081 LDI R24,1
251 E090 LDI R25,0
252 01FA MOVW R30,R20
253 8791 STD Z+9,R25
254 8780 STD Z+8,R24
(0575) }
(0576) }
(0577) }
(0578) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
255 01FA MOVW R30,R20
256 8142 LDD R20,Z+2
257 8153 LDD R21,Z+3
(0579) OS_EXIT_CRITICAL();
258 2D0A MOV R16,R10
259 940E 0BBA CALL _OS_CPU_SR_Restore
25B 01FA MOVW R30,R20
25C 8583 LDD R24,Z+11
25D 338F CPI R24,0x3F
25E F009 BEQ 0x0260
25F CFC3 RJMP 0x0223
(0580) }
(0581) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -