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

📄 ucos-port2.lst

📁 把UCOSII移植到AVR MEGA8上的程序 应用程序为驱动1602显示器,虽说有些简单,但可测试UCOS的运行
💻 LST
📖 第 1 页 / 共 5 页
字号:
  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 + -