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 + -
显示快捷键?