📄 ucos-port2.lst
字号:
ptcb --> R12
0262 DB2F RCALL push_gset4
(0427) }
(0428) /*$PAGE*/
(0429) /*
(0430) *********************************************************************************************************
(0431) * STATISTICS INITIALIZATION
(0432) *
(0433) * Description: This function is called by your application to establish CPU usage by first determining
(0434) * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
(0435) * during that time. CPU usage is then determined by a low priority task which keeps track
(0436) * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
(0437) * determined by:
(0438) *
(0439) * OSIdleCtr
(0440) * CPU Usage (%) = 100 * (1 - ------------)
(0441) * OSIdleCtrMax
(0442) *
(0443) * Arguments : none
(0444) *
(0445) * Returns : none
(0446) *********************************************************************************************************
(0447) */
(0448)
(0449) #if OS_TASK_STAT_EN > 0
(0450) void OSStatInit (void)
(0451) {
(0452) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0453) OS_CPU_SR cpu_sr;
(0454) #endif
(0455)
(0456)
(0457) OSTimeDly(2); /* Synchronize with clock tick */
(0458) OS_ENTER_CRITICAL();
(0459) OSIdleCtr = 0L; /* Clear idle counter */
(0460) OS_EXIT_CRITICAL();
(0461) OSTimeDly(OS_TICKS_PER_SEC); /* Determine MAX. idle counter value for 1 second */
(0462) OS_ENTER_CRITICAL();
(0463) OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1 second */
(0464) OSStatRdy = TRUE;
(0465) OS_EXIT_CRITICAL();
(0466) }
(0467) #endif
(0468) /*$PAGE*/
(0469) /*
(0470) *********************************************************************************************************
(0471) * PROCESS SYSTEM TICK
(0472) *
(0473) * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
(0474) * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
(0475) * called by a high priority task.
(0476) *
(0477) * Arguments : none
(0478) *
(0479) * Returns : none
(0480) *********************************************************************************************************
(0481) */
(0482)
(0483) void OSTimeTick (void)
(0484) {
(0485) #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
(0486) OS_CPU_SR cpu_sr;
(0487) #endif
(0488) OS_TCB *ptcb;
(0489)
(0490)
(0491) OSTimeTickHook(); /* Call user definable hook */
0263 D36D RCALL _OSTimeTickHook
(0492) #if OS_TIME_GET_SET_EN > 0
(0493) OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
0264 D93F RCALL _OS_CPU_SR_Save
0265 2EA0 MOV R10,R16
(0494) OSTime++;
0266 E041 LDI R20,1
0267 E050 LDI R21,0
0268 E060 LDI R22,0
0269 E070 LDI R23,0
026A 90400090 LDS R4,OSTime+2
026C 90500091 LDS R5,OSTime+3
026E 9020008E LDS R2,OSTime
0270 9030008F LDS R3,OSTime+1
0272 0E24 ADD R2,R20
0273 1E35 ADC R3,R21
0274 1E46 ADC R4,R22
0275 1E57 ADC R5,R23
0276 9230008F STS OSTime+1,R3
0278 9220008E STS OSTime,R2
027A 92500091 STS OSTime+3,R5
027C 92400090 STS OSTime+2,R4
(0495) OS_EXIT_CRITICAL();
027E D928 RCALL _OS_CPU_SR_Restore
(0496) #endif
(0497) ptcb = OSTCBList; /* Point at first TCB in TCB list */
027F 90C0011C LDS R12,OSTCBList
0281 90D0011D LDS R13,OSTCBList+1
0283 C03A RJMP 0x02BE
(0498) while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
(0499) OS_ENTER_CRITICAL();
0284 D91F RCALL _OS_CPU_SR_Save
0285 2EA0 MOV R10,R16
(0500) if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0286 01F6 MOVW R30,R12
0287 8420 LDD R2,Z+8
0288 8431 LDD R3,Z+9
0289 2022 TST R2
028A F419 BNE 0x028E
028B 2033 TST R3
028C F409 BNE 0x028E
028D C02B RJMP 0x02B9
(0501) if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
028E 01C6 MOVW R24,R12
028F 9608 ADIW R24,0x8
0290 01FC MOVW R30,R24
0291 8180 LDD R24,Z+0
0292 8191 LDD R25,Z+1
0293 9701 SBIW R24,1
0294 012C MOVW R4,R24
0295 8251 STD Z+1,R5
0296 8240 STD Z+0,R4
0297 3080 CPI R24,0
0298 0789 CPC R24,R25
0299 F009 BEQ 0x029B
029A C01E RJMP 0x02B9
(0502) if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == 0x00) { /* Is task suspended? */
029B 01F6 MOVW R30,R12
029C 8422 LDD R2,Z+10
029D FC23 SBRC R2,3
029E C015 RJMP 0x02B4
(0503) OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
029F 01F6 MOVW R30,R12
02A0 8427 LDD R2,Z+15
02A1 903001AD LDS R3,OSRdyGrp
02A3 2832 OR R3,R2
02A4 923001AD STS OSRdyGrp,R3
(0504) OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
02A6 EA8A LDI R24,0xAA
02A7 E091 LDI R25,1
02A8 01F6 MOVW R30,R12
02A9 8425 LDD R2,Z+13
02AA 2433 CLR R3
02AB 0E28 ADD R2,R24
02AC 1E39 ADC R3,R25
02AD 01F6 MOVW R30,R12
02AE 8446 LDD R4,Z+14
02AF 01F1 MOVW R30,R2
02B0 8050 LDD R5,Z+0
02B1 2854 OR R5,R4
02B2 8250 STD Z+0,R5
(0505) } else { /* Yes, Leave 1 tick to prevent ... */
02B3 C005 RJMP 0x02B9
(0506) ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
02B4 E081 LDI R24,1
02B5 E090 LDI R25,0
02B6 01F6 MOVW R30,R12
02B7 8791 STD Z+9,R25
02B8 8780 STD Z+8,R24
(0507) } /* ... suspension is removed. */
(0508) }
(0509) }
(0510) ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
02B9 01F6 MOVW R30,R12
02BA 80C2 LDD R12,Z+2
02BB 80D3 LDD R13,Z+3
(0511) OS_EXIT_CRITICAL();
02BC 2D0A MOV R16,R10
02BD D8E9 RCALL _OS_CPU_SR_Restore
02BE 01F6 MOVW R30,R12
02BF 8583 LDD R24,Z+11
02C0 3184 CPI R24,0x14
02C1 F009 BEQ 0x02C3
02C2 CFC1 RJMP 0x0284
02C3 DAC8 RCALL pop_gset4
02C4 9508 RET
(0512) }
(0513) }
(0514) /*$PAGE*/
(0515) /*
(0516) *********************************************************************************************************
(0517) * GET VERSION
(0518) *
(0519) * Description: This function is used to return the version number of uC/OS-II. The returned value
(0520) * corresponds to uC/OS-II's version number multiplied by 100. In other words, version 2.00
(0521) * would be returned as 200.
(0522) *
(0523) * Arguments : none
(0524) *
(0525) * Returns : the version number of uC/OS-II multiplied by 100.
(0526) *********************************************************************************************************
(0527) */
(0528)
(0529) INT16U OSVersion (void)
(0530) {
(0531) return (OS_VERSION);
_OSVersion:
02C5 EF0B LDI R16,0xFB
02C6 E010 LDI R17,0
02C7 9508 RET
_OS_EventTaskRdy:
bity --> R12
bitx --> R22
prio --> R20
x --> R20
ptcb --> R14
y --> R10
msk --> Y+10
msg --> R18
pevent --> R16
02C8 DAC7 RCALL push_gset5
(0532) }
(0533)
(0534) /*$PAGE*/
(0535) /*
(0536) *********************************************************************************************************
(0537) * DUMMY FUNCTION
(0538) *
(0539) * Description: This function doesn't do anything. It is called by OSTaskDel().
(0540) *
(0541) * Arguments : none
(0542) *
(0543) * Returns : none
(0544) *********************************************************************************************************
(0545) */
(0546)
(0547) #if OS_TASK_DEL_EN > 0
(0548) void OS_Dummy (void)
(0549) {
(0550) }
(0551) #endif
(0552)
(0553) /*$PAGE*/
(0554) /*
(0555) *********************************************************************************************************
(0556) * MAKE TASK READY TO RUN BASED ON EVENT OCCURING
(0557) *
(0558) * Description: This function is called by other uC/OS-II services and is used to ready a task that was
(0559) * waiting for an event to occur.
(0560) *
(0561) * Arguments : pevent is a pointer to the event control block corresponding to the event.
(0562) *
(0563) * msg is a pointer to a message. This pointer is used by message oriented services
(0564) * such as MAILBOXEs and QUEUEs. The pointer is not used when called by other
(0565) * service functions.
(0566) *
(0567) * msk is a mask that is used to clear the status byte of the TCB. For example,
(0568) * OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
(0569) *
(0570) * Returns : none
(0571) *
(0572) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0573) *********************************************************************************************************
(0574) */
(0575) #if OS_EVENT_EN > 0
(0576) INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
(0577) {
(0578) OS_TCB *ptcb;
(0579) INT8U x;
(0580) INT8U y;
(0581) INT8U bitx;
(0582) INT8U bity;
(0583) INT8U prio;
(0584)
(0585)
(0586) y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
02C9 E386 LDI R24,0x36
02CA E090 LDI R25,0
02CB 01F8 MOVW R30,R16
02CC 81E1 LDD R30,Z+1
02CD 27FF CLR R31
02CE 0FE8 ADD R30,R24
02CF 1FF9 ADC R31,R25
02D0 90A4 LPM R10,0(Z)
(0587) bity = OSMapTbl[y];
02D1 E28E LDI R24,0x2E
02D2 E090 LDI R25,0
02D3 2DEA MOV R30,R10
02D4 27FF CLR R31
02D5 0FE8 ADD R30,R24
02D6 1FF9 ADC R31,R25
02D7 90C4 LPM R12,0(Z)
(0588) x = OSUnMapTbl[pevent->OSEventTbl[y]];
02D8 01C8 MOVW R24,R16
02D9 9606 ADIW R24,6
02DA 2DEA MOV R30,R10
02DB 27FF CLR R31
02DC 0FE8 ADD R30,R24
02DD 1FF9 ADC R31,R25
02DE 81E0 LDD R30,Z+0
02DF 27FF CLR R31
02E0 E386 LDI R24,0x36
02E1 E090 LDI R25,0
02E2 0FE8 ADD R30,R24
02E3 1FF9 ADC R31,R25
02E4 9144 LPM R20,0(Z)
(0589) bitx = OSMapTbl[x];
02E5 E28E LDI R24,0x2E
02E6 E090 LDI R25,0
02E7 2FE4 MOV R30,R20
02E8 27FF CLR R31
02E9 0FE8 ADD R30,R24
02EA 1FF9 ADC R31,R25
02EB 9164 LPM R22,0(Z)
(0590) prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
02EC 2E24 MOV R2,R20
02ED 2433 CLR R3
02EE 2D4A MOV R20,R10
02EF 2755 CLR R21
02F0 0F44 LSL R20
02F1 1F55 ROL R21
02F2 0F44 LSL R20
02F3 1F55 ROL R21
02F4 0F44 LSL R20
02F5 1F55 ROL R21
02F6 0D42 ADD R20,R2
02F7 1D53 ADC R21,R3
(0591) if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) { /* Remove this task from the waiting list */
02F8 01C8 MOVW R24,R16
02F9 9606 ADIW R24,6
02FA 2C2A MOV R2,R10
02FB 2433 CLR R3
02FC 0E28 ADD R2,R24
02FD 1E39 ADC R3,R25
02FE 2E46 MOV R4,R22
02FF 9440 COM R4
0300 01F1 MOVW R30,R2
0301 8050 LDD R5,Z+0
0302 2054 AND R5,R4
0303 2C45 MOV R4,R5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -