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

📄 os_flag.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;482    #endif
;;;483        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
;;;484            OS_EXIT_CRITICAL();
;;;485            *err = OS_ERR_EVENT_TYPE;
;;;486            return;
;;;487        }
;;;488        len = OS_StrLen(pname);                      /* Can we fit the string in the storage area?         */
;;;489        if (len > (OS_FLAG_NAME_SIZE - 1)) {         /* No                                                 */
;;;490            OS_EXIT_CRITICAL();
;;;491            *err = OS_ERR_FLAG_NAME_TOO_LONG;
;;;492            return;
;;;493        }
;;;494        (void)OS_StrCopy(pgrp->OSFlagName, pname);   /* Yes, copy name from OS_FLAG_GRP                    */
;;;495        OS_EXIT_CRITICAL();
;;;496        *err = OS_ERR_NONE;
;;;497        return;
;;;498    }
00062c  e8bd41f0          POP      {r4-r8,lr}
000630  e12fff1e          BX       lr
                  |L1.1588|
000634  e3540000          CMP      r4,#0
000638  1a000004          BNE      |L1.1616|
00063c  e1a00008          MOV      r0,r8
000640  ebfffffe          BL       OS_CPU_SR_Restore
000644  e3a0006e          MOV      r0,#0x6e
000648  e5c70000          STRB     r0,[r7,#0]
00064c  eafffff6          B        |L1.1580|
                  |L1.1616|
000650  e3550000          CMP      r5,#0
000654  1a000004          BNE      |L1.1644|
000658  e1a00008          MOV      r0,r8
00065c  ebfffffe          BL       OS_CPU_SR_Restore
000660  e3a0000c          MOV      r0,#0xc
000664  e5c70000          STRB     r0,[r7,#0]
000668  eaffffef          B        |L1.1580|
                  |L1.1644|
00066c  e5d40000          LDRB     r0,[r4,#0]
000670  e3500005          CMP      r0,#5
000674  0a000004          BEQ      |L1.1676|
000678  e1a00008          MOV      r0,r8
00067c  ebfffffe          BL       OS_CPU_SR_Restore
000680  e3a00001          MOV      r0,#1
000684  e5c70000          STRB     r0,[r7,#0]
000688  eaffffe7          B        |L1.1580|
                  |L1.1676|
00068c  e1a00005          MOV      r0,r5
000690  ebfffffe          BL       OS_StrLen
000694  e1a06000          MOV      r6,r0
000698  e356000f          CMP      r6,#0xf
00069c  da000004          BLE      |L1.1716|
0006a0  e1a00008          MOV      r0,r8
0006a4  ebfffffe          BL       OS_CPU_SR_Restore
0006a8  e3a00073          MOV      r0,#0x73
0006ac  e5c70000          STRB     r0,[r7,#0]
0006b0  eaffffdd          B        |L1.1580|
                  |L1.1716|
0006b4  e1a01005          MOV      r1,r5
0006b8  e284000a          ADD      r0,r4,#0xa
0006bc  ebfffffe          BL       OS_StrCopy
0006c0  e1a00008          MOV      r0,r8
0006c4  ebfffffe          BL       OS_CPU_SR_Restore
0006c8  e3a00000          MOV      r0,#0
0006cc  e5c70000          STRB     r0,[r7,#0]
0006d0  eaffffd5          B        |L1.1580|
                          ENDP

                  OS_FlagBlock PROC
;;;984    static  void  OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;985    {
0006d4  e92d4070          PUSH     {r4-r6,lr}
0006d8  e59de010          LDR      lr,[sp,#0x10]
;;;986        OS_FLAG_NODE  *pnode_next;
;;;987        INT8U          y;
;;;988    
;;;989    
;;;990        OSTCBCur->OSTCBStat      |= OS_STAT_FLAG;
0006dc  e59f5890          LDR      r5,|L1.3956|
0006e0  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
0006e4  e5d5502c          LDRB     r5,[r5,#0x2c]
0006e8  e3855020          ORR      r5,r5,#0x20
0006ec  e59f6880          LDR      r6,|L1.3956|
0006f0  e5966000          LDR      r6,[r6,#0]  ; OSTCBCur
0006f4  e5c6502c          STRB     r5,[r6,#0x2c]
;;;991        OSTCBCur->OSTCBStatPend   = OS_STAT_PEND_OK;
0006f8  e3a05000          MOV      r5,#0
0006fc  e59f6870          LDR      r6,|L1.3956|
000700  e5966000          LDR      r6,[r6,#0]  ; OSTCBCur
000704  e5c6502d          STRB     r5,[r6,#0x2d]
;;;992        OSTCBCur->OSTCBDly        = timeout;              /* Store timeout in task's TCB                   */
000708  e59f5864          LDR      r5,|L1.3956|
00070c  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
000710  e1c5e2ba          STRH     lr,[r5,#0x2a]
;;;993    #if OS_TASK_DEL_EN > 0
;;;994        OSTCBCur->OSTCBFlagNode   = pnode;                /* TCB to link to node                           */
000714  e59f5858          LDR      r5,|L1.3956|
000718  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
00071c  e5851024          STR      r1,[r5,#0x24]
;;;995    #endif
;;;996        pnode->OSFlagNodeFlags    = flags;                /* Save the flags that we need to wait for       */
000720  e1c121b0          STRH     r2,[r1,#0x10]
;;;997        pnode->OSFlagNodeWaitType = wait_type;            /* Save the type of wait we are doing            */
000724  e5c13012          STRB     r3,[r1,#0x12]
;;;998        pnode->OSFlagNodeTCB      = (void *)OSTCBCur;     /* Link to task's TCB                            */
000728  e59f5844          LDR      r5,|L1.3956|
00072c  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
000730  e5815008          STR      r5,[r1,#8]
;;;999        pnode->OSFlagNodeNext     = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
000734  e5905004          LDR      r5,[r0,#4]
000738  e5815000          STR      r5,[r1,#0]
;;;1000       pnode->OSFlagNodePrev     = (void *)0;
00073c  e3a05000          MOV      r5,#0
000740  e5815004          STR      r5,[r1,#4]
;;;1001       pnode->OSFlagNodeFlagGrp  = (void *)pgrp;         /* Link to Event Flag Group                      */
000744  e581000c          STR      r0,[r1,#0xc]
;;;1002       pnode_next                = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
000748  e5904004          LDR      r4,[r0,#4]
;;;1003       if (pnode_next != (void *)0) {                    /* Is this the first NODE to insert?             */
00074c  e3540000          CMP      r4,#0
000750  0a000000          BEQ      |L1.1880|
;;;1004           pnode_next->OSFlagNodePrev = pnode;           /* No, link in doubly linked list                */
000754  e5841004          STR      r1,[r4,#4]
                  |L1.1880|
;;;1005       }
;;;1006       pgrp->OSFlagWaitList = (void *)pnode;
000758  e5801004          STR      r1,[r0,#4]
;;;1007   
;;;1008       y            =  OSTCBCur->OSTCBY;                 /* Suspend current task until flag(s) received   */
00075c  e59f5810          LDR      r5,|L1.3956|
000760  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
000764  e5d5c030          LDRB     r12,[r5,#0x30]
;;;1009       OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
000768  e59f5800          LDR      r5,|L1.3952|
00076c  e7d5500c          LDRB     r5,[r5,r12]
000770  e59f67fc          LDR      r6,|L1.3956|
000774  e5966000          LDR      r6,[r6,#0]  ; OSTCBCur
000778  e5d66031          LDRB     r6,[r6,#0x31]
00077c  e1c55006          BIC      r5,r5,r6
000780  e59f67e8          LDR      r6,|L1.3952|
000784  e7c6500c          STRB     r5,[r6,r12]
;;;1010       if (OSRdyTbl[y] == 0x00) {
000788  e2865000          ADD      r5,r6,#0
00078c  e7d5500c          LDRB     r5,[r5,r12]
000790  e3550000          CMP      r5,#0
000794  1a000007          BNE      |L1.1976|
;;;1011           OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000798  e59f57d4          LDR      r5,|L1.3956|
00079c  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
0007a0  e5d55032          LDRB     r5,[r5,#0x32]
0007a4  e59f67c0          LDR      r6,|L1.3948|
0007a8  e5d66000          LDRB     r6,[r6,#0]  ; OSRdyGrp
0007ac  e1c65005          BIC      r5,r6,r5
0007b0  e59f67b4          LDR      r6,|L1.3948|
0007b4  e5c65000          STRB     r5,[r6,#0]  ; OSRdyGrp
                  |L1.1976|
;;;1012       }
;;;1013   }
0007b8  e8bd4070          POP      {r4-r6,lr}
0007bc  e12fff1e          BX       lr
                          ENDP

                  OSFlagPend PROC
;;;556    OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
;;;557    {
0007c0  e92d4ff0          PUSH     {r4-r11,lr}
0007c4  e24dd024          SUB      sp,sp,#0x24
0007c8  e1a04000          MOV      r4,r0
0007cc  e1a05001          MOV      r5,r1
0007d0  e1a06002          MOV      r6,r2
0007d4  e1a07003          MOV      r7,r3
0007d8  e59d8048          LDR      r8,[sp,#0x48]
;;;558        OS_FLAG_NODE  node;
;;;559        OS_FLAGS      flags_rdy;
;;;560        INT8U         result;
;;;561        INT8U         pend_stat;
;;;562        BOOLEAN       consume;
;;;563    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;564        OS_CPU_SR     cpu_sr = 0;
0007dc  e3a00000          MOV      r0,#0
0007e0  e58d0008          STR      r0,[sp,#8]
;;;565    #endif
;;;566    
;;;567    
;;;568    
;;;569    #if OS_ARG_CHK_EN > 0
;;;570        if (err == (INT8U *)0) {                               /* Validate 'err'                           */
0007e4  e3580000          CMP      r8,#0
0007e8  1a000003          BNE      |L1.2044|
;;;571            return ((OS_FLAGS)0);
0007ec  e3a00000          MOV      r0,#0
                  |L1.2032|
0007f0  e28dd024          ADD      sp,sp,#0x24
0007f4  e8bd4ff0          POP      {r4-r11,lr}
;;;572        }
;;;573        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
;;;574            *err = OS_ERR_FLAG_INVALID_PGRP;
;;;575            return ((OS_FLAGS)0);
;;;576        }
;;;577    #endif
;;;578        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;579            *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
;;;580            return ((OS_FLAGS)0);
;;;581        }
;;;582        if (OSLockNesting > 0) {                               /* See if called with scheduler locked ...  */
;;;583            *err = OS_ERR_PEND_LOCKED;                         /* ... can't PEND when locked               */
;;;584            return ((OS_FLAGS)0);
;;;585        }
;;;586        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
;;;587            *err = OS_ERR_EVENT_TYPE;
;;;588            return ((OS_FLAGS)0);
;;;589        }
;;;590        result = (INT8U)(wait_type & OS_FLAG_CONSUME);
;;;591        if (result != (INT8U)0) {                             /* See if we need to consume the flags      */
;;;592            wait_type &= ~(INT8U)OS_FLAG_CONSUME;
;;;593            consume    = OS_TRUE;
;;;594        } else {
;;;595            consume    = OS_FALSE;
;;;596        }
;;;597    /*$PAGE*/
;;;598        OS_ENTER_CRITICAL();
;;;599        switch (wait_type) {
;;;600            case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
;;;601                 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags);   /* Extract only the bits we want     */
;;;602                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;;;603                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;604                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
;;;605                     }
;;;606                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;607                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;608                     *err                    = OS_ERR_NONE;
;;;609                     return (flags_rdy);
;;;610                 } else {                                      /* Block task until events occur or timeout */
;;;611                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;612                     OS_EXIT_CRITICAL();
;;;613                 }
;;;614                 break;
;;;615    
;;;616            case OS_FLAG_WAIT_SET_ANY:
;;;617                 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags);    /* Extract only the bits we want    */
;;;618                 if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
;;;619                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;620                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
;;;621                     }
;;;622                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;623                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;624                     *err                    = OS_ERR_NONE;
;;;625                     return (flags_rdy);
;;;626                 } else {                                      /* Block task until events occur or timeout */
;;;627                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;628                     OS_EXIT_CRITICAL();
;;;629                 }
;;;630                 break;
;;;631    
;;;632    #if OS_FLAG_WAIT_CLR_EN > 0
;;;633            case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
;;;634                 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags);  /* Extract only the bits we want     */
;;;635                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;;;636                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;637                         pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
;;;638                     }
;;;639                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;640                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;641                     *err                    = OS_ERR_NONE;
;;;642                     return (flags_rdy);
;;;643                 } else {                                      /* Block task until events occur or timeout */
;;;644                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;645                     OS_EXIT_CRITICAL();

⌨️ 快捷键说明

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