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

📄 os_tmr.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
00052e  f7fff7ff          BL       OSTmr_Unlock
;;;669                 return (OS_TRUE);
000532  2001              MOVS     r0,#1
000534  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1336|
;;;670    
;;;671            case OS_TMR_STATE_COMPLETED:                              /* Timer has already completed the ONE-SHOT or ...  */
;;;672            case OS_TMR_STATE_STOPPED:                                /* ... timer has not started yet.                   */
;;;673                 OSTmr_Unlock();
000538  f7fff7ff          BL       OSTmr_Unlock
;;;674                 *perr = OS_ERR_TMR_STOPPED;
00053c  208e              MOVS     r0,#0x8e
00053e  7020              STRB     r0,[r4,#0]
;;;675                 return (OS_TRUE);
000540  2001              MOVS     r0,#1
000542  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1350|
;;;676    
;;;677            case OS_TMR_STATE_UNUSED:                                 /* Timer was not created                            */
;;;678                 OSTmr_Unlock();
000546  f7fff7ff          BL       OSTmr_Unlock
;;;679                 *perr = OS_ERR_TMR_INACTIVE;
00054a  2087              MOVS     r0,#0x87
00054c  7020              STRB     r0,[r4,#0]
;;;680                 return (OS_FALSE);
00054e  2000              MOVS     r0,#0
000550  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1364|
;;;681    
;;;682            default:
;;;683                 OSTmr_Unlock();
000554  f7fff7ff          BL       OSTmr_Unlock
;;;684                 *perr = OS_ERR_TMR_INVALID_STATE;
000558  208d              MOVS     r0,#0x8d
00055a  7020              STRB     r0,[r4,#0]
;;;685                 return (OS_FALSE);
00055c  2000              MOVS     r0,#0
;;;686        }
;;;687    }
00055e  e8bde8bd          POP      {r4-r8,pc}
;;;688    #endif
                          ENDP

                  OSTmrSignal PROC
;;;715    
;;;716        err = OSSemPost(OSTmrSemSignal);
000562  4852              LDR      r0,|L1.1708|
000564  6800              LDR      r0,[r0,#0]  ; OSTmrSemSignal
000566  f7fff7ff          B.W      OSSemPost
;;;717        return (err);
;;;718    }
;;;719    #endif
                          ENDP

                  OSTmr_Task PROC
;;;1078   static  void  OSTmr_Task (void *p_arg)
;;;1079   {
00056a  e92de92d          PUSH     {r3-r9,lr}
00056e  f8dff8df          LDR      r8,|L1.1708|
000572  f8dff8df          LDR      r9,|L1.1712|
000576  4e4f              LDR      r6,|L1.1716|
000578  2702              MOVS     r7,#2
                  |L1.1402|
;;;1080       INT8U            err;
;;;1081       OS_TMR          *ptmr;
;;;1082       OS_TMR          *ptmr_next;
;;;1083       OS_TMR_CALLBACK  pfnct;
;;;1084       OS_TMR_WHEEL    *pspoke;
;;;1085       INT16U           spoke;
;;;1086   
;;;1087   
;;;1088       (void)p_arg;                                                 /* Not using 'p_arg', prevent compiler warning       */
;;;1089       for (;;) {
;;;1090           OSSemPend(OSTmrSemSignal, 0, &err);                      /* Wait for signal indicating time to update timers  */
00057a  466a              MOV      r2,sp
00057c  2100              MOVS     r1,#0
00057e  f8d8f8d8          LDR      r0,[r8,#0]  ; OSTmrSemSignal
000582  f7fff7ff          BL       OSSemPend
;;;1091           OSTmr_Lock();
000586  f7fff7ff          BL       OSTmr_Lock
;;;1092           OSTmrTime++;                                             /* Increment the current time                        */
00058a  6830              LDR      r0,[r6,#0]  ; OSTmrTime
00058c  1c40              ADDS     r0,r0,#1
00058e  6030              STR      r0,[r6,#0]  ; OSTmrTime
;;;1093           spoke  = (INT16U)(OSTmrTime % OS_TMR_CFG_WHEEL_SIZE);    /* Position on current timer wheel entry             */
000590  f000f000          AND      r0,r0,#7
;;;1094           pspoke = &OSTmrWheelTbl[spoke];
000594  eb09eb09          ADD      r0,r9,r0,LSL #3
;;;1095           ptmr   = pspoke->OSTmrFirst;
000598  6804              LDR      r4,[r0,#0]
;;;1096           while (ptmr != (OS_TMR *)0) {
00059a  b1d4              CBZ      r4,|L1.1490|
                  |L1.1436|
;;;1097               ptmr_next = (OS_TMR *)ptmr->OSTmrNext;               /* Point to next timer to update because current ... */
00059c  68e5              LDR      r5,[r4,#0xc]
;;;1098                                                                    /* ... timer could get unlinked from the wheel.      */
;;;1099               if (OSTmrTime == ptmr->OSTmrMatch) {                 /* Process each timer that expires                   */
00059e  6960              LDR      r0,[r4,#0x14]
0005a0  6831              LDR      r1,[r6,#0]  ; OSTmrTime
0005a2  4288              CMP      r0,r1
0005a4  d112              BNE      |L1.1484|
;;;1100                   pfnct = ptmr->OSTmrCallback;                     /* Execute callback function if available            */
0005a6  6862              LDR      r2,[r4,#4]
;;;1101                   if (pfnct != (OS_TMR_CALLBACK)0) {
0005a8  b112              CBZ      r2,|L1.1456|
;;;1102                       (*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg);
0005aa  4620              MOV      r0,r4
0005ac  68a1              LDR      r1,[r4,#8]
0005ae  4790              BLX      r2
                  |L1.1456|
;;;1103                   }
;;;1104                   OSTmr_Unlink(ptmr);                              /* Remove from current wheel spoke                   */
0005b0  4620              MOV      r0,r4
0005b2  f7fff7ff          BL       OSTmr_Unlink
;;;1105                   if (ptmr->OSTmrOpt == OS_TMR_OPT_PERIODIC) {
0005b6  f894f894          LDRB     r0,[r4,#0x30]
0005ba  2802              CMP      r0,#2
0005bc  d104              BNE      |L1.1480|
;;;1106                       OSTmr_Link(ptmr, OS_TMR_LINK_PERIODIC);      /* Recalculate new position of timer in wheel        */
0005be  2101              MOVS     r1,#1
0005c0  4620              MOV      r0,r4
0005c2  f7fff7ff          BL       OSTmr_Link
0005c6  e001              B        |L1.1484|
                  |L1.1480|
;;;1107                   } else {
;;;1108                       ptmr->OSTmrState = OS_TMR_STATE_COMPLETED;   /* Indicate that the timer has completed             */
0005c8  f884f884          STRB     r7,[r4,#0x31]
                  |L1.1484|
;;;1109                   }
;;;1110               }
;;;1111               ptmr = ptmr_next;
0005cc  462c              MOV      r4,r5
0005ce  2c00              CMP      r4,#0
0005d0  d1e4              BNE      |L1.1436|
                  |L1.1490|
;;;1112           }
;;;1113           OSTmr_Unlock();
0005d2  f7fff7ff          BL       OSTmr_Unlock
0005d6  e7d0              B        |L1.1402|
;;;1114       }
;;;1115   }
;;;1116   #endif
                          ENDP

                  OSTmr_InitTask PROC
;;;878    static  void  OSTmr_InitTask (void)
;;;879    {
0005d8  b500              PUSH     {lr}
0005da  b087              SUB      sp,sp,#0x1c
;;;880    #if OS_TASK_NAME_SIZE > 6
;;;881        INT8U  err;
;;;882    #endif
;;;883    
;;;884    
;;;885    #if OS_TASK_CREATE_EXT_EN > 0
;;;886        #if OS_STK_GROWTH == 1
;;;887        (void)OSTaskCreateExt(OSTmr_Task,
0005dc  2303              MOVS     r3,#3
0005de  2200              MOVS     r2,#0
0005e0  e9cde9cd          STRD     r2,r3,[sp,#0xc]
0005e4  f64ff64f          MOV      r3,#0xfffd
0005e8  2180              MOVS     r1,#0x80
0005ea  4833              LDR      r0,|L1.1720|
0005ec  9300              STR      r3,[sp,#0]
0005ee  9102              STR      r1,[sp,#8]
0005f0  231d              MOVS     r3,#0x1d
0005f2  9001              STR      r0,[sp,#4]
0005f4  f500f500          ADD      r2,r0,#0x1fc
0005f8  2100              MOVS     r1,#0
0005fa  f2aff2af          ADR      r0,OSTmr_Task + 1
0005fe  f7fff7ff          BL       OSTaskCreateExt
;;;888                              (void *)0,                                       /* No arguments passed to OSTmrTask()      */
;;;889                              &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1],         /* Set Top-Of-Stack                        */
;;;890                              OS_TASK_TMR_PRIO,
;;;891                              OS_TASK_TMR_ID,
;;;892                              &OSTmrTaskStk[0],                                /* Set Bottom-Of-Stack                     */
;;;893                              OS_TASK_TMR_STK_SIZE,
;;;894                              (void *)0,                                       /* No TCB extension                        */
;;;895                              OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);      /* Enable stack checking + clear stack     */
;;;896        #else
;;;897        (void)OSTaskCreateExt(OSTmr_Task,
;;;898                              (void *)0,                                       /* No arguments passed to OSTmrTask()      */
;;;899                              &OSTmrTaskStk[0],                                /* Set Top-Of-Stack                        */
;;;900                              OS_TASK_TMR_PRIO,
;;;901                              OS_TASK_TMR_ID,
;;;902                              &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1],         /* Set Bottom-Of-Stack                     */
;;;903                              OS_TASK_TMR_STK_SIZE,
;;;904                              (void *)0,                                       /* No TCB extension                        */
;;;905                              OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);      /* Enable stack checking + clear stack     */
;;;906        #endif
;;;907    #else
;;;908        #if OS_STK_GROWTH == 1
;;;909        (void)OSTaskCreate(OSTmr_Task,
;;;910                           (void *)0,
;;;911                           &OSTmrTaskStk[OS_TASK_TMR_STK_SIZE - 1],
;;;912                           OS_TASK_TMR_PRIO);
;;;913        #else
;;;914        (void)OSTaskCreate(OSTmr_Task,
;;;915                           (void *)0,
;;;916                           &OSTmrTaskStk[0],
;;;917                           OS_TASK_TMR_PRIO);
;;;918        #endif
;;;919    #endif
;;;920    
;;;921    #if OS_TASK_NAME_SIZE > 12
;;;922        OSTaskNameSet(OS_TASK_TMR_PRIO, (INT8U *)"uC/OS-II Tmr", &err);
000602  aa06              ADD      r2,sp,#0x18
000604  a12d              ADR      r1,|L1.1724|
000606  201d              MOVS     r0,#0x1d
000608  f7fff7ff          BL       OSTaskNameSet
;;;923    #else
;;;924    #if OS_TASK_NAME_SIZE > 6
;;;925        OSTaskNameSet(OS_TASK_TMR_PRIO, (INT8U *)"OS-Tmr", &err);
;;;926    #endif
;;;927    #endif
;;;928    }
00060c  b007              ADD      sp,sp,#0x1c
00060e  bd00              POP      {pc}
;;;929    #endif
                          ENDP

                  OSTmr_Init PROC
;;;804    void  OSTmr_Init (void)
;;;805    {
000610  b538              PUSH     {r3-r5,lr}
;;;806    #if OS_EVENT_NAME_SIZE > 10
;;;807        INT8U    err;
;;;808    #endif
;;;809        INT16U   i;
;;;810        OS_TMR  *ptmr1;
;;;811        OS_TMR  *ptmr2;
;;;812    
;;;813    
;;;814        OS_MemClr((INT8U *)&OSTmrTbl[0],      sizeof(OSTmrTbl));            /* Clear all the TMRs                         */
000612  f44ff44f          MOV      r1,#0x340
000616  482d              LDR      r0,|L1.1740|
000618  f7fff7ff          BL       OS_MemClr
;;;815        OS_MemClr((INT8U *)&OSTmrWheelTbl[0], sizeof(OSTmrWheelTbl));       /* Clear the timer wheel                      */
00061c  2140              MOVS     r1,#0x40
00061e  4824              LDR      r0,|L1.1712|
000620  f7fff7ff          BL       OS_MemClr
;;;816    
;;;817        ptmr1 = &OSTmrTbl[0];
000624  4829              LDR      r0,|L1.1740|
;;;818        ptmr2 = &OSTmrTbl[1];
000626  4604              MOV      r4,r0
000628  f104f104          ADD      r2,r4,#0x34
;;;819        for (i = 0; i < (OS_TMR_CFG_MAX - 1); i++) {                        /* Init. list of free TMRs                    */
00062c  2100              MOVS     r1,#0
00062e  2300              MOVS     r3,#0
000630  f04ff04f          MOV      lr,#0x64
000634  f04ff04f          MOV      r12,#0x3f
                  |L1.1592|
;;;820            ptmr1->OSTmrType    = OS_TMR_TYPE;
000638  f880f880          STRB     lr,[r0,#0]
;;;821            ptmr1->OSTmrState   = OS_TMR_STATE_UNUSED;                      /* Indicate that timer is inactive            */
00063c  f880f880          STRB     r3,[r0,#0x31]
;;;822            ptmr1->OSTmrNext    = (void *)ptmr2;                            /* Link to next timer                         */
000640  60c2              STR      r2,[r0,#0xc]
;;;823    #if OS_TMR_CFG_NAME_SIZE > 1
;;;824            ptmr1->OSTmrName[0] = '?';                                      /* Unknown name                               */
000642  f880f880          STRB     r12,[r0,#0x20]
;;;825            ptmr1->OSTmrName[1] = OS_ASCII_NUL;
000646  f880f880          STRB     r3,[r0,#0x21]
;;;826    #endif
;;;827            ptmr1++;
00064a  3034              ADDS     r0,r0,#0x34
;;;828            ptmr2++;
00064c  3234              ADDS     r2,r2,#0x34
00064e  1c49              ADDS     r1,r1,#1
000650  b289              UXTH     r1,r1
000652  290f              CMP      r1,#0xf
000654  d3f0              BCC      |L1.1592|
;;;829        }
;;;830        ptmr1->OSTmrType    = OS_TMR_TYPE;
000656  f880f880          STRB     lr,[r0,#0]
;;;831        ptmr1->OSTmrState   = OS_TMR_STATE_UNUSED;                          /* Indicate that timer is inactive            */
00065a  f880f880          STRB     r3,[r0,#0x31]
;;;832        ptmr1->OSTmrNext    = (void *)0;                                    /* Last OS_TMR                                */
00065e  60c3              STR      r3,[r0,#0xc]
;;;833    #if OS_TMR_CFG_NAME_SIZE > 1
;;;834        ptmr1->OSTmrName[0] = '?';                                          /* Unknown name                               */
000660  f880f880          STRB     r12,[r0,#0x20]
;;;835        ptmr1->OSTmrName[1] = OS_ASCII_NUL;
000664  f880f880          STRB     r3,[r0,#0x

⌨️ 快捷键说明

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