os_flag.txt

来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,195 行 · 第 1/5 页

TXT
1,195
字号
;;;557    #if OS_CRITICAL_METHOD == 3                          /* Allocate storage for CPU status register       */
;;;558        OS_CPU_SR     cpu_sr;
;;;559    #endif
;;;560        OS_FLAG_NODE *pnode;
;;;561        BOOLEAN       sched;
;;;562        OS_FLAGS      flags_cur;
;;;563        OS_FLAGS      flags_rdy;
;;;564    
;;;565    
;;;566    #if OS_ARG_CHK_EN > 0
;;;567        if (pgrp == (OS_FLAG_GRP *)0) {                  /* Validate 'pgrp'                                */
00074c  e3550000          CMP      r5,#0
000750  1a000004          BNE      |L1.1896|
;;;568            *err = OS_FLAG_INVALID_PGRP;
000754  e3a00096          MOV      r0,#0x96
000758  e5c70000          STRB     r0,[r7,#0]
;;;569            return ((OS_FLAGS)0);
00075c  e3a00000          MOV      r0,#0
                  |L1.1888|
000760  e8bd41f0          POP      {r4-r8,lr}
;;;570        }
;;;571        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {    /* Make sure we are pointing to an event flag grp */
;;;572            *err = OS_ERR_EVENT_TYPE;
;;;573            return ((OS_FLAGS)0);
;;;574        }
;;;575    #endif
;;;576    /*$PAGE*/
;;;577        OS_ENTER_CRITICAL();
;;;578        switch (opt) {
;;;579            case OS_FLAG_CLR:
;;;580                 pgrp->OSFlagFlags &= ~flags;            /* Clear the flags specified in the group         */
;;;581                 break;
;;;582    
;;;583            case OS_FLAG_SET:
;;;584                 pgrp->OSFlagFlags |=  flags;            /* Set   the flags specified in the group         */
;;;585                 break;
;;;586    
;;;587            default:
;;;588                 OS_EXIT_CRITICAL();                     /* INVALID option                                 */
;;;589                 *err = OS_FLAG_INVALID_OPT;
;;;590                 return ((OS_FLAGS)0);
;;;591        }
;;;592        sched = FALSE;                                   /* Indicate that we don't need rescheduling       */
;;;593        pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;;;594        while (pnode != (OS_FLAG_NODE *)0) {             /* Go through all tasks waiting on event flag(s)  */
;;;595            switch (pnode->OSFlagNodeWaitType) {
;;;596                case OS_FLAG_WAIT_SET_ALL:               /* See if all req. flags are set for current node */
;;;597                     flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;598                     if (flags_rdy == pnode->OSFlagNodeFlags) {
;;;599                         if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd   */
;;;600                             sched = TRUE;                               /* When done we will reschedule   */
;;;601                         }
;;;602                     }
;;;603                     break;
;;;604    
;;;605                case OS_FLAG_WAIT_SET_ANY:               /* See if any flag set                            */
;;;606                     flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;607                     if (flags_rdy != (OS_FLAGS)0) {
;;;608                         if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd   */
;;;609                             sched = TRUE;                               /* When done we will reschedule   */
;;;610                         }
;;;611                     }
;;;612                     break;
;;;613    
;;;614    #if OS_FLAG_WAIT_CLR_EN > 0
;;;615                case OS_FLAG_WAIT_CLR_ALL:               /* See if all req. flags are set for current node */
;;;616                     flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;617                     if (flags_rdy == pnode->OSFlagNodeFlags) {
;;;618                         if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd   */
;;;619                             sched = TRUE;                               /* When done we will reschedule   */
;;;620                         }
;;;621                     }
;;;622                     break;
;;;623    
;;;624                case OS_FLAG_WAIT_CLR_ANY:               /* See if any flag set                            */
;;;625                     flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;626                     if (flags_rdy != (OS_FLAGS)0) {
;;;627                         if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd   */
;;;628                             sched = TRUE;                               /* When done we will reschedule   */
;;;629                         }
;;;630                     }
;;;631                     break;
;;;632    #endif
;;;633            }
;;;634            pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
;;;635        }
;;;636        OS_EXIT_CRITICAL();
;;;637        if (sched == TRUE) {
;;;638            OS_Sched();
;;;639        }
;;;640        OS_ENTER_CRITICAL();
;;;641        flags_cur = pgrp->OSFlagFlags;
;;;642        OS_EXIT_CRITICAL();
;;;643        *err      = OS_NO_ERR;
;;;644        return (flags_cur);
;;;645    }
000764  e12fff1e          BX       lr
                  |L1.1896|
000768  e5d50000          LDRB     r0,[r5,#0]            ;571
00076c  e3500005          CMP      r0,#5                 ;571
000770  0a000003          BEQ      |L1.1924|
000774  e3a00001          MOV      r0,#1                 ;572
000778  e5c70000          STRB     r0,[r7,#0]            ;572
00077c  e3a00000          MOV      r0,#0                 ;573
000780  eafffff6          B        |L1.1888|
                  |L1.1924|
000784  ef000002          SVC      #0x2                  ;577
000788  e3540000          CMP      r4,#0                 ;578
00078c  0a000005          BEQ      |L1.1960|
000790  e3540001          CMP      r4,#1                 ;578
000794  1a000009          BNE      |L1.1984|
000798  e1d500b8          LDRH     r0,[r5,#8]            ;584
00079c  e1800006          ORR      r0,r0,r6              ;584
0007a0  e1c500b8          STRH     r0,[r5,#8]            ;584
0007a4  ea000002          B        |L1.1972|
                  |L1.1960|
0007a8  e1d500b8          LDRH     r0,[r5,#8]            ;580
0007ac  e1c00006          BIC      r0,r0,r6              ;580
0007b0  e1c500b8          STRH     r0,[r5,#8]            ;580
                  |L1.1972|
0007b4  e3a06000          MOV      r6,#0                 ;592
0007b8  e5954004          LDR      r4,[r5,#4]            ;593
0007bc  ea000039          B        |L1.2216|
                  |L1.1984|
0007c0  ef000003          SVC      #0x3                  ;588
0007c4  e3a00099          MOV      r0,#0x99              ;589
0007c8  e5c70000          STRB     r0,[r7,#0]            ;589
0007cc  e3a00000          MOV      r0,#0                 ;590
0007d0  eaffffe2          B        |L1.1888|
                  |L1.2004|
0007d4  e5d40012          LDRB     r0,[r4,#0x12]         ;595
0007d8  e3500000          CMP      r0,#0                 ;595
0007dc  0a00001b          BEQ      |L1.2128|
0007e0  e3500001          CMP      r0,#1                 ;595
0007e4  0a000024          BEQ      |L1.2172|
0007e8  e3500002          CMP      r0,#2                 ;595
0007ec  0a00000c          BEQ      |L1.2084|
0007f0  e3500003          CMP      r0,#3                 ;595
0007f4  1a00002a          BNE      |L1.2212|
0007f8  e1d500b8          LDRH     r0,[r5,#8]            ;606
0007fc  e1d411b0          LDRH     r1,[r4,#0x10]         ;606
000800  e0011000          AND      r1,r1,r0              ;606
000804  e3510000          CMP      r1,#0                 ;607
000808  0a000025          BEQ      |L1.2212|
00080c  e1a00004          MOV      r0,r4                 ;608
000810  ebfffffe          BL       OS_FlagTaskRdy
000814  e3500001          CMP      r0,#1                 ;608
000818  1a000021          BNE      |L1.2212|
00081c  e3a06001          MOV      r6,#1                 ;609
000820  ea00001f          B        |L1.2212|
                  |L1.2084|
000824  e1d510b8          LDRH     r1,[r5,#8]            ;597
000828  e1d401b0          LDRH     r0,[r4,#0x10]         ;597
00082c  e0011000          AND      r1,r1,r0              ;597
000830  e1500001          CMP      r0,r1                 ;598
000834  1a00001a          BNE      |L1.2212|
000838  e1a00004          MOV      r0,r4                 ;599
00083c  ebfffffe          BL       OS_FlagTaskRdy
000840  e3500001          CMP      r0,#1                 ;599
000844  1a000016          BNE      |L1.2212|
000848  e3a06001          MOV      r6,#1                 ;600
00084c  ea000014          B        |L1.2212|
                  |L1.2128|
000850  e1d401b0          LDRH     r0,[r4,#0x10]         ;616
000854  e1d510b8          LDRH     r1,[r5,#8]            ;616
000858  e1c01001          BIC      r1,r0,r1              ;616
00085c  e1500001          CMP      r0,r1                 ;617
000860  1a00000f          BNE      |L1.2212|
000864  e1a00004          MOV      r0,r4                 ;618
000868  ebfffffe          BL       OS_FlagTaskRdy
00086c  e3500001          CMP      r0,#1                 ;618
000870  1a00000b          BNE      |L1.2212|
000874  e3a06001          MOV      r6,#1                 ;619
000878  ea000009          B        |L1.2212|
                  |L1.2172|
00087c  e1d401b0          LDRH     r0,[r4,#0x10]         ;625
000880  e1d510b8          LDRH     r1,[r5,#8]            ;625
000884  e1c01001          BIC      r1,r0,r1              ;625
000888  e3510000          CMP      r1,#0                 ;626
00088c  0a000004          BEQ      |L1.2212|
000890  e1a00004          MOV      r0,r4                 ;627
000894  ebfffffe          BL       OS_FlagTaskRdy
000898  e3500001          CMP      r0,#1                 ;627
00089c  1a000000          BNE      |L1.2212|
0008a0  e3a06001          MOV      r6,#1                 ;628
                  |L1.2212|
0008a4  e5944000          LDR      r4,[r4,#0]            ;634
                  |L1.2216|
0008a8  e3540000          CMP      r4,#0                 ;594
0008ac  1affffc8          BNE      |L1.2004|
0008b0  ef000003          SVC      #0x3                  ;636
0008b4  e3560001          CMP      r6,#1                 ;637
0008b8  1a000000          BNE      |L1.2240|
0008bc  ebfffffe          BL       OS_Sched
                  |L1.2240|
0008c0  ef000002          SVC      #0x2                  ;640
0008c4  e1d540b8          LDRH     r4,[r5,#8]            ;641
0008c8  ef000003          SVC      #0x3                  ;642
0008cc  e3a00000          MOV      r0,#0                 ;643
0008d0  e5c70000          STRB     r0,[r7,#0]            ;643
0008d4  e1a00004          MOV      r0,r4                 ;644
0008d8  eaffffa0          B        |L1.1888|
;;;646    /*$PAGE*/
                          ENDP

                  OSFlagQuery PROC
;;;667    OS_FLAGS  OSFlagQuery (OS_FLAG_GRP *pgrp, INT8U *err)
;;;668    {
0008dc  e92d4070          PUSH     {r4-r6,lr}
0008e0  e1a05000          MOV      r5,r0
0008e4  e1a04001          MOV      r4,r1
;;;669    #if OS_CRITICAL_METHOD == 3                       /* Allocate storage for CPU status register          */
;;;670        OS_CPU_SR  cpu_sr;
;;;671    #endif
;;;672        OS_FLAGS   flags;
;;;673    
;;;674    
;;;675    #if OS_ARG_CHK_EN > 0
;;;676        if (pgrp == (OS_FLAG_GRP *)0) {               /* Validate 'pgrp'                                   */
0008e8  e3550000          CMP      r5,#0
0008ec  1a000004          BNE      |L1.2308|
;;;677            *err = OS_FLAG_INVALID_PGRP;
0008f0  e3a00096          MOV      r0,#0x96
0008f4  e5c40000          STRB     r0,[r4,#0]
;;;678            return ((OS_FLAGS)0);
0008f8  e3a00000          MOV      r0,#0
                  |L1.2300|
0008fc  e8bd4070          POP      {r4-r6,lr}
;;;679        }
;;;680        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type                         */
;;;681            *err = OS_ERR_EVENT_TYPE;
;;;682            return ((OS_FLAGS)0);
;;;683        }
;;;684    #endif
;;;685        OS_ENTER_CRITICAL();
;;;686        flags = pgrp->OSFlagFlags;
;;;687        OS_EXIT_CRITICAL();
;;;688        *err = OS_NO_ERR;
;;;689        return (flags);                   

⌨️ 快捷键说明

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