⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.lst

📁 基于mega128的ucos参考源码
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -