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

📄 os_flag.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;403    
;;;404    
;;;405    #if OS_ARG_CHK_EN > 0
;;;406        if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
;;;407            return (0);
;;;408        }
;;;409        if (pgrp == (OS_FLAG_GRP *)0) {              /* Is 'pgrp' a NULL pointer?                          */
;;;410            *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;411            return (0);
;;;412        }
;;;413        if (pname == (INT8U *)0) {                   /* Is 'pname' a NULL pointer?                         */
;;;414            *perr = OS_ERR_PNAME_NULL;
;;;415            return (0);
;;;416        }
;;;417    #endif
;;;418        if (OSIntNesting > 0) {                      /* See if trying to call from an ISR                  */
00034c  e59f0594          LDR      r0,|L1.2280|
000350  e1a07001          MOV      r7,r1                 ;397
000354  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000358  e1a05002          MOV      r5,r2                 ;397
00035c  e3500000          CMP      r0,#0
;;;419            *perr = OS_ERR_NAME_GET_ISR;
000360  13a00011          MOVNE    r0,#0x11
;;;420            return (0);
000364  1a000007          BNE      |L1.904|
;;;421        }
;;;422        OS_ENTER_CRITICAL();
000368  ebfffffe          BL       OS_CPU_SR_Save
00036c  e1a04000          MOV      r4,r0
;;;423        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
000370  e5d60000          LDRB     r0,[r6,#0]
000374  e3500005          CMP      r0,#5
000378  0a000006          BEQ      |L1.920|
;;;424            OS_EXIT_CRITICAL();
00037c  e1a00004          MOV      r0,r4
000380  ebfffffe          BL       OS_CPU_SR_Restore
;;;425            *perr = OS_ERR_EVENT_TYPE;
000384  e3a00001          MOV      r0,#1
                  |L1.904|
000388  e5c50000          STRB     r0,[r5,#0]
;;;426            return (0);
00038c  e3a00000          MOV      r0,#0
                  |L1.912|
000390  e8bd41f0          POP      {r4-r8,lr}
;;;427        }
;;;428        len   = OS_StrCopy(pname, pgrp->OSFlagName); /* Copy name from OS_FLAG_GRP                         */
;;;429        OS_EXIT_CRITICAL();
;;;430        *perr = OS_ERR_NONE;
;;;431        return (len);
;;;432    }
000394  e12fff1e          BX       lr
                  |L1.920|
000398  e286100a          ADD      r1,r6,#0xa            ;428
00039c  e1a00007          MOV      r0,r7                 ;428
0003a0  ebfffffe          BL       OS_StrCopy
0003a4  e1a06000          MOV      r6,r0                 ;428
0003a8  e1a00004          MOV      r0,r4                 ;429
0003ac  ebfffffe          BL       OS_CPU_SR_Restore
0003b0  e3a00000          MOV      r0,#0                 ;430
0003b4  e5c50000          STRB     r0,[r5,#0]            ;430
0003b8  e1a00006          MOV      r0,r6                 ;431
0003bc  eafffff3          B        |L1.912|
;;;433    #endif
                          ENDP

                  OSFlagNameSet PROC
;;;460    void  OSFlagNameSet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
;;;461    {
0003c0  e92d41f0          PUSH     {r4-r8,lr}
0003c4  e1a06000          MOV      r6,r0
;;;462        INT8U      len;
;;;463    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;464        OS_CPU_SR  cpu_sr = 0;
;;;465    #endif
;;;466    
;;;467    
;;;468    
;;;469    #if OS_ARG_CHK_EN > 0
;;;470        if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
;;;471            return;
;;;472        }
;;;473        if (pgrp == (OS_FLAG_GRP *)0) {              /* Is 'pgrp' a NULL pointer?                          */
;;;474            *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;475            return;
;;;476        }
;;;477        if (pname == (INT8U *)0) {                   /* Is 'pname' a NULL pointer?                         */
;;;478            *perr = OS_ERR_PNAME_NULL;
;;;479            return;
;;;480        }
;;;481    #endif
;;;482        if (OSIntNesting > 0) {                      /* See if trying to call from an ISR                  */
0003c8  e59f0518          LDR      r0,|L1.2280|
0003cc  e1a07001          MOV      r7,r1                 ;461
0003d0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0003d4  e1a04002          MOV      r4,r2                 ;461
0003d8  e3500000          CMP      r0,#0
;;;483            *perr = OS_ERR_NAME_SET_ISR;
0003dc  13a00012          MOVNE    r0,#0x12
;;;484            return;
0003e0  1a000016          BNE      |L1.1088|
;;;485        }
;;;486        OS_ENTER_CRITICAL();
0003e4  ebfffffe          BL       OS_CPU_SR_Save
0003e8  e1a05000          MOV      r5,r0
;;;487        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
0003ec  e5d60000          LDRB     r0,[r6,#0]
0003f0  e3500005          CMP      r0,#5
0003f4  0a000003          BEQ      |L1.1032|
;;;488            OS_EXIT_CRITICAL();
0003f8  e1a00005          MOV      r0,r5
0003fc  ebfffffe          BL       OS_CPU_SR_Restore
;;;489            *perr = OS_ERR_EVENT_TYPE;
000400  e3a00001          MOV      r0,#1
;;;490            return;
000404  ea00000d          B        |L1.1088|
                  |L1.1032|
;;;491        }
;;;492        len = OS_StrLen(pname);                      /* Can we fit the string in the storage area?         */
000408  e1a00007          MOV      r0,r7
00040c  ebfffffe          BL       OS_StrLen
;;;493        if (len > (OS_FLAG_NAME_SIZE - 1)) {         /* No                                                 */
000410  e350000f          CMP      r0,#0xf
000414  9a000003          BLS      |L1.1064|
;;;494            OS_EXIT_CRITICAL();
000418  e1a00005          MOV      r0,r5
00041c  ebfffffe          BL       OS_CPU_SR_Restore
;;;495            *perr = OS_ERR_FLAG_NAME_TOO_LONG;
000420  e3a00073          MOV      r0,#0x73
;;;496            return;
000424  ea000005          B        |L1.1088|
                  |L1.1064|
;;;497        }
;;;498        (void)OS_StrCopy(pgrp->OSFlagName, pname);   /* Yes, copy name from OS_FLAG_GRP                    */
000428  e1a01007          MOV      r1,r7
00042c  e286000a          ADD      r0,r6,#0xa
000430  ebfffffe          BL       OS_StrCopy
;;;499        OS_EXIT_CRITICAL();
000434  e1a00005          MOV      r0,r5
000438  ebfffffe          BL       OS_CPU_SR_Restore
;;;500        *perr = OS_ERR_NONE;
00043c  e3a00000          MOV      r0,#0
                  |L1.1088|
000440  e5c40000          STRB     r0,[r4,#0]
;;;501        return;
;;;502    }
000444  e8bd41f0          POP      {r4-r8,lr}
000448  e12fff1e          BX       lr
;;;503    #endif
                          ENDP

                  OS_FlagBlock PROC
;;;988    static  void  OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;989    {
00044c  e92d4030          PUSH     {r4,r5,lr}
;;;990        OS_FLAG_NODE  *pnode_next;
;;;991        INT8U          y;
;;;992    
;;;993    
;;;994        OSTCBCur->OSTCBStat      |= OS_STAT_FLAG;
000450  e59fe4a0          LDR      lr,|L1.2296|
000454  e59d500c          LDR      r5,[sp,#0xc]
000458  e59ec000          LDR      r12,[lr,#0]  ; OSTCBCur
00045c  e5dc402c          LDRB     r4,[r12,#0x2c]
000460  e3844020          ORR      r4,r4,#0x20
000464  e5cc402c          STRB     r4,[r12,#0x2c]
;;;995        OSTCBCur->OSTCBStatPend   = OS_STAT_PEND_OK;
000468  e3a04000          MOV      r4,#0
00046c  e5cc402d          STRB     r4,[r12,#0x2d]
;;;996        OSTCBCur->OSTCBDly        = timeout;              /* Store timeout in task's TCB                   */
000470  e1cc52ba          STRH     r5,[r12,#0x2a]
;;;997    #if OS_TASK_DEL_EN > 0
;;;998        OSTCBCur->OSTCBFlagNode   = pnode;                /* TCB to link to node                           */
000474  e58c1024          STR      r1,[r12,#0x24]
;;;999    #endif
;;;1000       pnode->OSFlagNodeFlags    = flags;                /* Save the flags that we need to wait for       */
000478  e1c121b0          STRH     r2,[r1,#0x10]
;;;1001       pnode->OSFlagNodeWaitType = wait_type;            /* Save the type of wait we are doing            */
00047c  e5c13012          STRB     r3,[r1,#0x12]
;;;1002       pnode->OSFlagNodeTCB      = (void *)OSTCBCur;     /* Link to task's TCB                            */
;;;1003       pnode->OSFlagNodeNext     = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
000480  e581c008          STR      r12,[r1,#8]
000484  e5902004          LDR      r2,[r0,#4]
;;;1004       pnode->OSFlagNodePrev     = (void *)0;
;;;1005       pnode->OSFlagNodeFlagGrp  = (void *)pgrp;         /* Link to Event Flag Group                      */
;;;1006       pnode_next                = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
000488  e581000c          STR      r0,[r1,#0xc]
00048c  e8810014          STM      r1,{r2,r4}
000490  e5902004          LDR      r2,[r0,#4]
;;;1007       if (pnode_next != (void *)0) {                    /* Is this the first NODE to insert?             */
000494  e3520000          CMP      r2,#0
;;;1008           pnode_next->OSFlagNodePrev = pnode;           /* No, link in doubly linked list                */
000498  15821004          STRNE    r1,[r2,#4]
;;;1009       }
;;;1010       pgrp->OSFlagWaitList = (void *)pnode;
;;;1011   
;;;1012       y            =  OSTCBCur->OSTCBY;                 /* Suspend current task until flag(s) received   */
00049c  e5801004          STR      r1,[r0,#4]
0004a0  e59e1000          LDR      r1,[lr,#0]  ; OSTCBCur
;;;1013       OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
0004a4  e59f2448          LDR      r2,|L1.2292|
0004a8  e5d10030          LDRB     r0,[r1,#0x30]         ;1012
0004ac  e5d1c031          LDRB     r12,[r1,#0x31]
0004b0  e7d23000          LDRB     r3,[r2,r0]
0004b4  e1c3300c          BIC      r3,r3,r12
0004b8  e7c23000          STRB     r3,[r2,r0]
;;;1014       if (OSRdyTbl[y] == 0x00) {
0004bc  e7d20000          LDRB     r0,[r2,r0]
0004c0  e3500000          CMP      r0,#0
;;;1015           OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
0004c4  059f0424          LDREQ    r0,|L1.2288|
0004c8  05d11032          LDRBEQ   r1,[r1,#0x32]
0004cc  05d02000          LDRBEQ   r2,[r0,#0]  ; OSRdyGrp
0004d0  01c21001          BICEQ    r1,r2,r1
0004d4  05c01000          STRBEQ   r1,[r0,#0]  ; OSRdyGrp
;;;1016       }
;;;1017   }
0004d8  e8bd4030          POP      {r4,r5,lr}
0004dc  e12fff1e          BX       lr
;;;1018   
                          ENDP

                  OSFlagPend PROC
;;;560    OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *perr)
;;;561    {
0004e0  e92d4fff          PUSH     {r0-r11,lr}
0004e4  e1a04000          MOV      r4,r0
;;;562        OS_FLAG_NODE  node;
;;;563        OS_FLAGS      flags_rdy;
;;;564        INT8U         result;
;;;565        INT8U         pend_stat;
;;;566        BOOLEAN       consume;
;;;567    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;568        OS_CPU_SR     cpu_sr = 0;
;;;569    #endif
;;;570    
;;;571    
;;;572    
;;;573    #if OS_ARG_CHK_EN > 0
;;;574        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;575            return ((OS_FLAGS)0);
;;;576        }
;;;577        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
;;;578            *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;579            return ((OS_FLAGS)0);
;;;580        }
;;;581    #endif
;;;582        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0004e8  e59f03f8          LDR      r0,|L1.2280|
0004ec  e24dd01c          SUB      sp,sp,#0x1c           ;561
0004f0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0004f4  e59d5050          LDR      r5,[sp,#0x50]
0004f8  e1a07001          MOV      r7,r1                 ;561
0004fc  e3500000          CMP      r0,#0

⌨️ 快捷键说明

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