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

📄 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 页
字号:
000500  e1a08002          MOV      r8,r2                 ;561
;;;583            *perr = OS_ERR_PEND_ISR;                           /* ... can't PEND from an ISR               */
000504  13a00002          MOVNE    r0,#2
;;;584            return ((OS_FLAGS)0);
000508  1a00006f          BNE      |L1.1740|
;;;585        }
;;;586        if (OSLockNesting > 0) {                               /* See if called with scheduler locked ...  */
00050c  e59f03e8          LDR      r0,|L1.2300|
000510  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
000514  e3500000          CMP      r0,#0
;;;587            *perr = OS_ERR_PEND_LOCKED;                        /* ... can't PEND when locked               */
000518  13a0000d          MOVNE    r0,#0xd
;;;588            return ((OS_FLAGS)0);
00051c  1a00006a          BNE      |L1.1740|
;;;589        }
;;;590        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
000520  e5d40000          LDRB     r0,[r4,#0]
000524  e3500005          CMP      r0,#5
;;;591            *perr = OS_ERR_EVENT_TYPE;
000528  13a00001          MOVNE    r0,#1
;;;592            return ((OS_FLAGS)0);
00052c  1a000066          BNE      |L1.1740|
;;;593        }
;;;594        result = (INT8U)(wait_type & OS_FLAG_CONSUME);
000530  e3180080          TST      r8,#0x80
;;;595        if (result != (INT8U)0) {                             /* See if we need to consume the flags      */
;;;596            wait_type &= ~(INT8U)OS_FLAG_CONSUME;
;;;597            consume    = OS_TRUE;
;;;598        } else {
;;;599            consume    = OS_FALSE;
000534  03a06000          MOVEQ    r6,#0
000538  13c88080          BICNE    r8,r8,#0x80           ;596
00053c  13a06001          MOVNE    r6,#1                 ;597
;;;600        }
;;;601    /*$PAGE*/
;;;602        OS_ENTER_CRITICAL();
000540  ebfffffe          BL       OS_CPU_SR_Save
000544  e59fb3ac          LDR      r11,|L1.2296|
;;;603        switch (wait_type) {
000548  e3580000          CMP      r8,#0
00054c  e3a0a000          MOV      r10,#0                ;602
000550  e58d0004          STR      r0,[sp,#4]
000554  0a000011          BEQ      |L1.1440|
000558  e3580001          CMP      r8,#1
00055c  0a000020          BEQ      |L1.1508|
000560  e3580002          CMP      r8,#2
000564  0a000005          BEQ      |L1.1408|
000568  e3580003          CMP      r8,#3
00056c  1a00003b          BNE      |L1.1632|
;;;604            case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
;;;605                 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags);   /* Extract only the bits we want     */
;;;606                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;;;607                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;608                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
;;;609                     }
;;;610                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;611                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;612                     *perr                   = OS_ERR_NONE;
;;;613                     return (flags_rdy);
;;;614                 } else {                                      /* Block task until events occur or timeout */
;;;615                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;616                     OS_EXIT_CRITICAL();
;;;617                 }
;;;618                 break;
;;;619    
;;;620            case OS_FLAG_WAIT_SET_ANY:
;;;621                 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags);    /* Extract only the bits we want    */
000570  e1d400b8          LDRH     r0,[r4,#8]
000574  e0109007          ANDS     r9,r0,r7
;;;622                 if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
000578  0a00001c          BEQ      |L1.1520|
00057c  ea000003          B        |L1.1424|
                  |L1.1408|
000580  e1d400b8          LDRH     r0,[r4,#8]            ;605
000584  e0009007          AND      r9,r0,r7              ;605
000588  e1590007          CMP      r9,r7                 ;606
00058c  1a000017          BNE      |L1.1520|
                  |L1.1424|
000590  e3560001          CMP      r6,#1                 ;607
000594  1a000009          BNE      |L1.1472|
000598  e1c00009          BIC      r0,r0,r9              ;608
00059c  ea000006          B        |L1.1468|
                  |L1.1440|
;;;623                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;624                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
;;;625                     }
;;;626                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;627                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;628                     *perr                   = OS_ERR_NONE;
;;;629                     return (flags_rdy);
;;;630                 } else {                                      /* Block task until events occur or timeout */
;;;631                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;632                     OS_EXIT_CRITICAL();
;;;633                 }
;;;634                 break;
;;;635    
;;;636    #if OS_FLAG_WAIT_CLR_EN > 0
;;;637            case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
;;;638                 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags);  /* Extract only the bits we want     */
0005a0  e1d400b8          LDRH     r0,[r4,#8]
0005a4  e1c79000          BIC      r9,r7,r0
;;;639                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
0005a8  e1590007          CMP      r9,r7
0005ac  1a00000f          BNE      |L1.1520|
                  |L1.1456|
;;;640                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
0005b0  e3560001          CMP      r6,#1
0005b4  1a000001          BNE      |L1.1472|
;;;641                         pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
;;;642                     }
;;;643                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;644                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;645                     *perr                   = OS_ERR_NONE;
;;;646                     return (flags_rdy);
;;;647                 } else {                                      /* Block task until events occur or timeout */
;;;648                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;649                     OS_EXIT_CRITICAL();
;;;650                 }
;;;651                 break;
;;;652    
;;;653            case OS_FLAG_WAIT_CLR_ANY:
;;;654                 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want      */
;;;655                 if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag cleared                  */
;;;656                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;657                         pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we got           */
0005b8  e1800009          ORR      r0,r0,r9
                  |L1.1468|
0005bc  e1c400b8          STRH     r0,[r4,#8]            ;608
                  |L1.1472|
;;;658                     }
;;;659                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
0005c0  e59b0000          LDR      r0,[r11,#0]  ; OSTCBCur
0005c4  e1c092b8          STRH     r9,[r0,#0x28]
;;;660                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
0005c8  e59d0004          LDR      r0,[sp,#4]
0005cc  ebfffffe          BL       OS_CPU_SR_Restore
;;;661                     *perr                   = OS_ERR_NONE;
;;;662                     return (flags_rdy);
0005d0  e1a00009          MOV      r0,r9
0005d4  e5c5a000          STRB     r10,[r5,#0]           ;661
                  |L1.1496|
0005d8  e28dd02c          ADD      sp,sp,#0x2c
0005dc  e8bd4ff0          POP      {r4-r11,lr}
;;;663                 } else {                                      /* Block task until events occur or timeout */
;;;664                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;665                     OS_EXIT_CRITICAL();
;;;666                 }
;;;667                 break;
;;;668    #endif
;;;669    
;;;670            default:
;;;671                 OS_EXIT_CRITICAL();
;;;672                 flags_rdy = (OS_FLAGS)0;
;;;673                 *perr      = OS_ERR_FLAG_WAIT_TYPE;
;;;674                 return (flags_rdy);
;;;675        }
;;;676    /*$PAGE*/
;;;677        OS_Sched();                                            /* Find next HPT ready to run               */
;;;678        OS_ENTER_CRITICAL();
;;;679        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) {      /* Have we timed-out or aborted?            */
;;;680            pend_stat                = OSTCBCur->OSTCBStatPend;
;;;681            OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;682            OS_FlagUnlink(&node);
;;;683            OSTCBCur->OSTCBStat      = OS_STAT_RDY;            /* Yes, make task ready-to-run              */
;;;684            OS_EXIT_CRITICAL();
;;;685            flags_rdy                = (OS_FLAGS)0;
;;;686            switch (pend_stat) {
;;;687                case OS_STAT_PEND_TO:
;;;688                default:
;;;689                     *perr = OS_ERR_TIMEOUT;                    /* Indicate that we timed-out waiting       */
;;;690                     break;
;;;691    
;;;692                case OS_STAT_PEND_ABORT:
;;;693                     *perr = OS_ERR_PEND_ABORT;                 /* Indicate that we aborted   waiting       */
;;;694                     break;
;;;695            }
;;;696            return (flags_rdy);
;;;697        }
;;;698        flags_rdy = OSTCBCur->OSTCBFlagsRdy;
;;;699        if (consume == OS_TRUE) {                              /* See if we need to consume the flags      */
;;;700            switch (wait_type) {
;;;701                case OS_FLAG_WAIT_SET_ALL:
;;;702                case OS_FLAG_WAIT_SET_ANY:                     /* Clear ONLY the flags we got              */
;;;703                     pgrp->OSFlagFlags &= ~flags_rdy;
;;;704                     break;
;;;705    
;;;706    #if OS_FLAG_WAIT_CLR_EN > 0
;;;707                case OS_FLAG_WAIT_CLR_ALL:
;;;708                case OS_FLAG_WAIT_CLR_ANY:                     /* Set   ONLY the flags we got              */
;;;709                     pgrp->OSFlagFlags |=  flags_rdy;
;;;710                     break;
;;;711    #endif
;;;712                default:
;;;713                     OS_EXIT_CRITICAL();
;;;714                     *perr = OS_ERR_FLAG_WAIT_TYPE;
;;;715                     return ((OS_FLAGS)0);
;;;716            }
;;;717        }
;;;718        OS_EXIT_CRITICAL();
;;;719        *perr = OS_ERR_NONE;                                   /* Event(s) must have occurred              */
;;;720        return (flags_rdy);
;;;721    }
0005e0  e12fff1e          BX       lr
                  |L1.1508|
0005e4  e1d400b8          LDRH     r0,[r4,#8]            ;654
0005e8  e1d79000          BICS     r9,r7,r0              ;654
0005ec  1affffef          BNE      |L1.1456|
                  |L1.1520|
0005f0  e59d3028          LDR      r3,[sp,#0x28]         ;664
0005f4  e1a02007          MOV      r2,r7                 ;664
0005f8  e58d3000          STR      r3,[sp,#0]            ;664
0005fc  e1a03008          MOV      r3,r8                 ;664
000600  e28d1008          ADD      r1,sp,#8              ;664
000604  e1a00004          MOV      r0,r4                 ;664
000608  ebfffffe          BL       OS_FlagBlock
00060c  e59d0004          LDR      r0,[sp,#4]            ;665
000610  ebfffffe          BL       OS_CPU_SR_Restore
000614  ebfffffe          BL       OS_Sched
000618  ebfffffe          BL       OS_CPU_SR_Save
00061c  e1a0c000          MOV      r12,r0                ;678
000620  e59b0000          LDR      r0,[r11,#0]           ;679  ; OSTCBCur
000624  e5d0702d          LDRB     r7,[r0,#0x2d]         ;679
000628  e3570000          CMP      r7,#0                 ;679
00062c  0a000010          BEQ      |L1.1652|
000630  e5c0a02d          STRB     r10,[r0,#0x2d]        ;681
000634  e28d0008          ADD      r0,sp,#8              ;682
000638  ebfffffe          BL       OS_FlagUnlink
00063c  e59b0000          LDR      r0,[r11,#0]           ;683  ; OSTCBCur
000640  e5c0a02c          STRB     r10,[r0,#0x2c]        ;683
000644  e1a0000c          MOV      r0,r12                ;684
000648  ebfffffe          BL       OS_CPU_SR_Restore
00064c  e3570002          CMP      r7,#2                 ;686
000650  e3a00000          MOV      r0,#0                 ;685
000654  03a0100e          MOVEQ    r1,#0xe               ;693
000658  13a0100a          MOVNE    r1,#0xa               ;689
00065c  ea000002          B        |L1.1644|
                  |L1.1632|
000660  ebfffffe          BL       OS_CPU_SR_Restore
000664  e3a00000          MOV      r0,#0                 ;672
000668  e3a0106f          MOV      r1,#0x6f              ;673
                  |L1.1644|
00066c  e5c51000          STRB     r1,[r5,#0]            ;693
000670  eaffffd8          B        |L1.1496|
                  |L1.1652|
000674  e1d072b8          LDRH     r7,[r0,#0x28]         ;698
000678  e3560001          CMP      r6,#1                 ;699
00067c  1a00000a          BNE      |L1.1708|
000680  e3580000          CMP      r8,#0                 ;700
000684  13580001          CMPNE    r8,#1                 ;700
000688  01d400b8          LDRHEQ   r0,[r4,#8]            ;709
00068c  01800007          ORREQ    r0,r0,r7              ;709
000690  0a000004          BEQ      |L1.1704|
000694  e3580002          CMP      r8,#2                 ;700

⌨️ 快捷键说明

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