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

📄 os_tmr.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;370        if (perr == (INT8U *)0) {
000298  b914              CBNZ     r4,|L1.672|
;;;371            return (0);
00029a  2000              MOVS     r0,#0
00029c  e8bde8bd          POP      {r4-r8,pc}
                  |L1.672|
;;;372        }
;;;373        if (ptmr == (OS_TMR *)0) {
0002a0  b925              CBNZ     r5,|L1.684|
;;;374            *perr = OS_ERR_TMR_INVALID;
0002a2  208a              MOVS     r0,#0x8a
0002a4  7020              STRB     r0,[r4,#0]
;;;375            return (0);
0002a6  2000              MOVS     r0,#0
0002a8  e8bde8bd          POP      {r4-r8,pc}
                  |L1.684|
;;;376        }
;;;377    #endif
;;;378        if (ptmr->OSTmrType != OS_TMR_TYPE) {              /* Validate timer structure                                    */
0002ac  7828              LDRB     r0,[r5,#0]
0002ae  2864              CMP      r0,#0x64
0002b0  d004              BEQ      |L1.700|
;;;379            *perr = OS_ERR_TMR_INVALID_TYPE;
0002b2  2089              MOVS     r0,#0x89
0002b4  7020              STRB     r0,[r4,#0]
;;;380            return (0);
0002b6  2000              MOVS     r0,#0
0002b8  e8bde8bd          POP      {r4-r8,pc}
                  |L1.700|
;;;381        }
;;;382        if (OSIntNesting > 0) {                            /* See if trying to call from an ISR                           */
0002bc  484d              LDR      r0,|L1.1012|
0002be  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
0002c0  b120              CBZ      r0,|L1.716|
;;;383            *perr = OS_ERR_TMR_ISR;
0002c2  208b              MOVS     r0,#0x8b
0002c4  7020              STRB     r0,[r4,#0]
;;;384            return (0);
0002c6  2000              MOVS     r0,#0
0002c8  e8bde8bd          POP      {r4-r8,pc}
                  |L1.716|
;;;385        }
;;;386        OSTmr_Lock();
0002cc  f7fff7ff          BL       OSTmr_Lock
;;;387        switch (ptmr->OSTmrState) {
0002d0  f895f895          LDRB     r0,[r5,#0x31]
0002d4  2800              CMP      r0,#0
0002d6  d028              BEQ      |L1.810|
0002d8  2700              MOVS     r7,#0
0002da  2801              CMP      r0,#1
0002dc  d00d              BEQ      |L1.762|
0002de  2802              CMP      r0,#2
0002e0  d01d              BEQ      |L1.798|
0002e2  2803              CMP      r0,#3
0002e4  d128              BNE      |L1.824|
;;;388            case OS_TMR_STATE_RUNNING:
;;;389                 remain = ptmr->OSTmrMatch - OSTmrTime;    /* Determine how much time is left to timeout                  */
0002e6  4945              LDR      r1,|L1.1020|
0002e8  6968              LDR      r0,[r5,#0x14]
0002ea  6809              LDR      r1,[r1,#0]  ; OSTmrTime
0002ec  1a45              SUBS     r5,r0,r1
;;;390                 OSTmr_Unlock();
0002ee  f7fff7ff          BL       OSTmr_Unlock
;;;391                 *perr  = OS_ERR_NONE;
0002f2  7027              STRB     r7,[r4,#0]
;;;392                 return (remain);
0002f4  4628              MOV      r0,r5
0002f6  e8bde8bd          POP      {r4-r8,pc}
                  |L1.762|
;;;393    
;;;394            case OS_TMR_STATE_STOPPED:                     /* It's assumed that the timer has not started yet             */
;;;395                 switch (ptmr->OSTmrOpt) {
0002fa  f895f895          LDRB     r0,[r5,#0x30]
0002fe  2802              CMP      r0,#2
000300  d106              BNE      |L1.784|
;;;396                     case OS_TMR_OPT_PERIODIC:
;;;397                          if (ptmr->OSTmrDly == 0) {
000302  69ae              LDR      r6,[r5,#0x18]
000304  b906              CBNZ     r6,|L1.776|
;;;398                              remain = ptmr->OSTmrPeriod;
000306  69ee              LDR      r6,[r5,#0x1c]
                  |L1.776|
;;;399                          } else {
;;;400                              remain = ptmr->OSTmrDly;
;;;401                          }
;;;402                          OSTmr_Unlock();
000308  f7fff7ff          BL       OSTmr_Unlock
;;;403                          *perr  = OS_ERR_NONE;
00030c  7027              STRB     r7,[r4,#0]
;;;404                          break;
00030e  e003              B        |L1.792|
                  |L1.784|
;;;405    
;;;406                     case OS_TMR_OPT_ONE_SHOT:
;;;407                     default:
;;;408                          remain = ptmr->OSTmrDly;
000310  69ae              LDR      r6,[r5,#0x18]
;;;409                          OSTmr_Unlock();
000312  f7fff7ff          BL       OSTmr_Unlock
;;;410                          *perr  = OS_ERR_NONE;
000316  7027              STRB     r7,[r4,#0]
                  |L1.792|
;;;411                          break;
;;;412                 }
;;;413                 return (remain);
000318  4630              MOV      r0,r6
00031a  e8bde8bd          POP      {r4-r8,pc}
                  |L1.798|
;;;414    
;;;415            case OS_TMR_STATE_COMPLETED:                   /* Only ONE-SHOT that timed out can be in this state           */
;;;416                 OSTmr_Unlock();
00031e  f7fff7ff          BL       OSTmr_Unlock
;;;417                 *perr = OS_ERR_NONE;
000322  7027              STRB     r7,[r4,#0]
;;;418                 return (0);
000324  2000              MOVS     r0,#0
000326  e8bde8bd          POP      {r4-r8,pc}
                  |L1.810|
;;;419    
;;;420            case OS_TMR_STATE_UNUSED:
;;;421                 OSTmr_Unlock();
00032a  f7fff7ff          BL       OSTmr_Unlock
;;;422                 *perr = OS_ERR_TMR_INACTIVE;
00032e  2087              MOVS     r0,#0x87
000330  7020              STRB     r0,[r4,#0]
;;;423                 return (0);
000332  2000              MOVS     r0,#0
000334  e8bde8bd          POP      {r4-r8,pc}
                  |L1.824|
;;;424    
;;;425            default:
;;;426                 OSTmr_Unlock();
000338  f7fff7ff          BL       OSTmr_Unlock
;;;427                 *perr = OS_ERR_TMR_INVALID_STATE;
00033c  208d              MOVS     r0,#0x8d
00033e  7020              STRB     r0,[r4,#0]
;;;428                 return (0);
000340  2000              MOVS     r0,#0
;;;429        }
;;;430    }
000342  e8bde8bd          POP      {r4-r8,pc}
;;;431    #endif
                          ENDP

                  OSTmrStateGet PROC
;;;461                          INT8U   *perr)
;;;462    {
000346  b570              PUSH     {r4-r6,lr}
000348  4605              MOV      r5,r0
00034a  460c              MOV      r4,r1
;;;463        INT8U  state;
;;;464    
;;;465    
;;;466    #if OS_ARG_CHK_EN > 0
;;;467        if (perr == (INT8U *)0) {
00034c  b90c              CBNZ     r4,|L1.850|
;;;468            return (0);
00034e  2000              MOVS     r0,#0
;;;469        }
;;;470        if (ptmr == (OS_TMR *)0) {
;;;471            *perr = OS_ERR_TMR_INVALID;
;;;472            return (0);
;;;473        }
;;;474    #endif
;;;475        if (ptmr->OSTmrType != OS_TMR_TYPE) {              /* Validate timer structure                                    */
;;;476            *perr = OS_ERR_TMR_INVALID_TYPE;
;;;477            return (0);
;;;478        }
;;;479        if (OSIntNesting > 0) {                            /* See if trying to call from an ISR                           */
;;;480            *perr = OS_ERR_TMR_ISR;
;;;481            return (0);
;;;482        }
;;;483        OSTmr_Lock();
;;;484        state = ptmr->OSTmrState;
;;;485        switch (state) {
;;;486            case OS_TMR_STATE_UNUSED:   
;;;487            case OS_TMR_STATE_STOPPED:  
;;;488            case OS_TMR_STATE_COMPLETED:
;;;489            case OS_TMR_STATE_RUNNING:  
;;;490                 *perr = OS_ERR_NONE;
;;;491                 break;
;;;492                 
;;;493            default:
;;;494                 *perr = OS_ERR_TMR_INVALID_STATE;
;;;495                 break;
;;;496        }
;;;497        OSTmr_Unlock();
;;;498        return (state);
;;;499    }
000350  bd70              POP      {r4-r6,pc}
                  |L1.850|
000352  b91d              CBNZ     r5,|L1.860|
000354  208a              MOVS     r0,#0x8a
000356  7020              STRB     r0,[r4,#0]
000358  2000              MOVS     r0,#0
00035a  bd70              POP      {r4-r6,pc}
                  |L1.860|
00035c  7828              LDRB     r0,[r5,#0]
00035e  2864              CMP      r0,#0x64
000360  d003              BEQ      |L1.874|
000362  2089              MOVS     r0,#0x89
000364  7020              STRB     r0,[r4,#0]
000366  2000              MOVS     r0,#0
000368  bd70              POP      {r4-r6,pc}
                  |L1.874|
00036a  4822              LDR      r0,|L1.1012|
00036c  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
00036e  b118              CBZ      r0,|L1.888|
000370  208b              MOVS     r0,#0x8b
000372  7020              STRB     r0,[r4,#0]
000374  2000              MOVS     r0,#0
000376  bd70              POP      {r4-r6,pc}
                  |L1.888|
000378  f7fff7ff          BL       OSTmr_Lock
00037c  f895f895          LDRB     r5,[r5,#0x31]
000380  b12d              CBZ      r5,|L1.910|
000382  2d01              CMP      r5,#1
000384  d003              BEQ      |L1.910|
000386  2d02              CMP      r5,#2
000388  d001              BEQ      |L1.910|
00038a  2d03              CMP      r5,#3
00038c  d102              BNE      |L1.916|
                  |L1.910|
00038e  2000              MOVS     r0,#0
000390  7020              STRB     r0,[r4,#0]
000392  e001              B        |L1.920|
                  |L1.916|
000394  208d              MOVS     r0,#0x8d
000396  7020              STRB     r0,[r4,#0]
                  |L1.920|
000398  f7fff7ff          BL       OSTmr_Unlock
00039c  4628              MOV      r0,r5
00039e  bd70              POP      {r4-r6,pc}
;;;500    #endif
                          ENDP

                  OSTmr_Link PROC
;;;956    
;;;957        ptmr->OSTmrState = OS_TMR_STATE_RUNNING;
0003a0  2203              MOVS     r2,#3
0003a2  f880f880          STRB     r2,[r0,#0x31]
;;;958        if (type == OS_TMR_LINK_PERIODIC) {                            /* Determine when timer will expire                */
0003a6  4a15              LDR      r2,|L1.1020|
0003a8  2901              CMP      r1,#1
0003aa  6812              LDR      r2,[r2,#0]
0003ac  d103              BNE      |L1.950|
;;;959            ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
0003ae  69c1              LDR      r1,[r0,#0x1c]
0003b0  4411              ADD      r1,r1,r2
0003b2  6141              STR      r1,[r0,#0x14]
0003b4  e007              B        |L1.966|
                  |L1.950|
;;;960        } else {
;;;961            if (ptmr->OSTmrDly == 0) {
0003b6  6981              LDR      r1,[r0,#0x18]
0003b8  b919              CBNZ     r1,|L1.962|
;;;962                ptmr->OSTmrMatch = ptmr->OSTmrPeriod + OSTmrTime;
0003ba  69c1              LDR      r1,[r0,#0x1c]
0003bc  4411              ADD      r1,r1,r2
0003be  6141              STR      r1,[r0,#0x14]
0003c0  e001              B        |L1.966|
                  |L1.962|
;;;963            } else {
;;;964                ptmr->OSTmrMatch = ptmr->OSTmrDly    + OSTmrTime;
0003c2  4411              ADD      r1,r1,r2
0003c4  6141              STR      r1,[r0,#0x14]
                  |L1.966|
;;;965            }
;;;966        }
;;;967        spoke  = (INT16U)(ptmr->OSTmrMatch % OS_TMR_CFG_WHEEL_SIZE);
0003c6  6941              LDR      r1,[r0,#0x14]
0003c8  f001f001          AND      r1,r1,#7
;;;968        pspoke = &OSTmrWheelTbl[spoke];
0003cc  4a0a              LDR      r2,|L1.1016|
0003ce  eb02eb02          ADD      r1,r2,r1,LSL #3
;;;969    
;;;970        if (pspoke->OSTmrFirst == (OS_TMR *)0) {                       /* Link into timer wheel                           */
0003d2  680a              LDR      r2,[r1,#0]
0003d4  2300              MOVS     r3,#0
0003d6  b99a              CBNZ     r2,|L1.1024|
;;;971            pspoke->OSTmrFirst   = ptmr;
0003d8  6008              STR      r0,[r1,#0]
;;;972            ptmr->OSTmrNext      = (OS_TMR *)0;
0003da  60c3              STR      r3,[r0,#0xc]
;;;973            pspoke->OSTmrEntries = 1;
0003dc  2201              MOVS     r2,#1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -