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

📄 os_flag.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;224            return ((OS_FLAG_GRP *)0);
;;;225        }
;;;226        OS_ENTER_CRITICAL();
;;;227        pgrp = OSFlagFreeList;                          /* Get next free event flag                        */
;;;228        if (pgrp != (OS_FLAG_GRP *)0) {                 /* See if we have event flag groups available      */
;;;229                                                        /* Adjust free list                                */
;;;230            OSFlagFreeList       = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
;;;231            pgrp->OSFlagType     = OS_EVENT_TYPE_FLAG;  /* Set to event flag group type                    */
;;;232            pgrp->OSFlagFlags    = flags;               /* Set to desired initial value                    */
;;;233            pgrp->OSFlagWaitList = (void *)0;           /* Clear list of tasks waiting on flags            */
;;;234    #if OS_FLAG_NAME_SIZE > 1
;;;235            pgrp->OSFlagName[0]  = '?';
;;;236            pgrp->OSFlagName[1]  = OS_ASCII_NUL;
;;;237    #endif
;;;238            OS_EXIT_CRITICAL();
;;;239            *err                 = OS_ERR_NONE;
;;;240        } else {
;;;241            OS_EXIT_CRITICAL();
;;;242            *err                 = OS_ERR_FLAG_GRP_DEPLETED;
;;;243        }
;;;244        return (pgrp);                                  /* Return pointer to event flag group              */
;;;245    }
0001f8  e12fff1e          BX       lr
                  |L1.508|
0001fc  e59f0d60          LDR      r0,|L1.3940|
000200  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000204  e3500000          CMP      r0,#0
000208  da000003          BLE      |L1.540|
00020c  e3a00010          MOV      r0,#0x10
000210  e5c50000          STRB     r0,[r5,#0]
000214  e3a00000          MOV      r0,#0
000218  eafffff5          B        |L1.500|
                  |L1.540|
00021c  ebfffffe          BL       OS_CPU_SR_Save
000220  e1a07000          MOV      r7,r0
000224  e59f0d3c          LDR      r0,|L1.3944|
000228  e5906000          LDR      r6,[r0,#0]  ; OSFlagFreeList
00022c  e3560000          CMP      r6,#0
000230  0a000012          BEQ      |L1.640|
000234  e59f0d2c          LDR      r0,|L1.3944|
000238  e5900000          LDR      r0,[r0,#0]  ; OSFlagFreeList
00023c  e5900004          LDR      r0,[r0,#4]
000240  e59f1d20          LDR      r1,|L1.3944|
000244  e5810000          STR      r0,[r1,#0]  ; OSFlagFreeList
000248  e3a00005          MOV      r0,#5
00024c  e5c60000          STRB     r0,[r6,#0]
000250  e1c640b8          STRH     r4,[r6,#8]
000254  e3a00000          MOV      r0,#0
000258  e5860004          STR      r0,[r6,#4]
00025c  e3a0003f          MOV      r0,#0x3f
000260  e5c6000a          STRB     r0,[r6,#0xa]
000264  e3a00000          MOV      r0,#0
000268  e5c6000b          STRB     r0,[r6,#0xb]
00026c  e1a00007          MOV      r0,r7
000270  ebfffffe          BL       OS_CPU_SR_Restore
000274  e3a00000          MOV      r0,#0
000278  e5c50000          STRB     r0,[r5,#0]
00027c  ea000003          B        |L1.656|
                  |L1.640|
000280  e1a00007          MOV      r0,r7
000284  ebfffffe          BL       OS_CPU_SR_Restore
000288  e3a00072          MOV      r0,#0x72
00028c  e5c50000          STRB     r0,[r5,#0]
                  |L1.656|
000290  e1a00006          MOV      r0,r6
000294  eaffffd6          B        |L1.500|
                          ENDP

                  OS_FlagUnlink PROC
;;;1141   void  OS_FlagUnlink (OS_FLAG_NODE *pnode)
;;;1142   {
000298  e52de004          PUSH     {lr}
;;;1143   #if OS_TASK_DEL_EN > 0
;;;1144       OS_TCB       *ptcb;
;;;1145   #endif
;;;1146       OS_FLAG_GRP  *pgrp;
;;;1147       OS_FLAG_NODE *pnode_prev;
;;;1148       OS_FLAG_NODE *pnode_next;
;;;1149   
;;;1150   
;;;1151       pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
00029c  e5903004          LDR      r3,[r0,#4]
;;;1152       pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
0002a0  e590c000          LDR      r12,[r0,#0]
;;;1153       if (pnode_prev == (OS_FLAG_NODE *)0) {                      /* Is it first node in wait list?      */
0002a4  e3530000          CMP      r3,#0
0002a8  1a000006          BNE      |L1.712|
;;;1154           pgrp                 = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
0002ac  e590200c          LDR      r2,[r0,#0xc]
;;;1155           pgrp->OSFlagWaitList = (void *)pnode_next;              /*      Update list for new 1st node   */
0002b0  e582c004          STR      r12,[r2,#4]
;;;1156           if (pnode_next != (OS_FLAG_NODE *)0) {
0002b4  e35c0000          CMP      r12,#0
0002b8  0a000006          BEQ      |L1.728|
;;;1157               pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0;     /*      Link new 1st node PREV to NULL */
0002bc  e3a0e000          MOV      lr,#0
0002c0  e58ce004          STR      lr,[r12,#4]
0002c4  ea000003          B        |L1.728|
                  |L1.712|
;;;1158           }
;;;1159       } else {                                                    /* No,  A node somewhere in the list   */
;;;1160           pnode_prev->OSFlagNodeNext = pnode_next;                /*      Link around the node to unlink */
0002c8  e583c000          STR      r12,[r3,#0]
;;;1161           if (pnode_next != (OS_FLAG_NODE *)0) {                  /*      Was this the LAST node?        */
0002cc  e35c0000          CMP      r12,#0
0002d0  0a000000          BEQ      |L1.728|
;;;1162               pnode_next->OSFlagNodePrev = pnode_prev;            /*      No, Link around current node   */
0002d4  e58c3004          STR      r3,[r12,#4]
                  |L1.728|
;;;1163           }
;;;1164       }
;;;1165   #if OS_TASK_DEL_EN > 0
;;;1166       ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;
0002d8  e5901008          LDR      r1,[r0,#8]
;;;1167       ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
0002dc  e3a0e000          MOV      lr,#0
0002e0  e581e024          STR      lr,[r1,#0x24]
;;;1168   #endif
;;;1169   }
0002e4  e49de004          POP      {lr}
0002e8  e12fff1e          BX       lr
                          ENDP

                  OS_FlagTaskRdy PROC
;;;1097   static  BOOLEAN  OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;1098   {
0002ec  e92d40f0          PUSH     {r4-r7,lr}
0002f0  e1a04000          MOV      r4,r0
0002f4  e1a05001          MOV      r5,r1
;;;1099       OS_TCB   *ptcb;
;;;1100       BOOLEAN   sched;
;;;1101   
;;;1102   
;;;1103       ptcb                 = (OS_TCB *)pnode->OSFlagNodeTCB; /* Point to TCB of waiting task             */
0002f8  e5946008          LDR      r6,[r4,#8]
;;;1104       ptcb->OSTCBDly       = 0;
0002fc  e3a00000          MOV      r0,#0
000300  e1c602ba          STRH     r0,[r6,#0x2a]
;;;1105       ptcb->OSTCBFlagsRdy  = flags_rdy;
000304  e1c652b8          STRH     r5,[r6,#0x28]
;;;1106       ptcb->OSTCBStat     &= ~(INT8U)OS_STAT_FLAG;
000308  e5d6002c          LDRB     r0,[r6,#0x2c]
00030c  e3c00020          BIC      r0,r0,#0x20
000310  e5c6002c          STRB     r0,[r6,#0x2c]
;;;1107       ptcb->OSTCBStatPend  = OS_STAT_PEND_OK;
000314  e3a00000          MOV      r0,#0
000318  e5c6002d          STRB     r0,[r6,#0x2d]
;;;1108       if (ptcb->OSTCBStat == OS_STAT_RDY) {                  /* Task now ready?                          */
00031c  e5d6002c          LDRB     r0,[r6,#0x2c]
000320  e3500000          CMP      r0,#0
000324  1a00000f          BNE      |L1.872|
;;;1109           OSRdyGrp               |= ptcb->OSTCBBitY;         /* Put task into ready list                 */
000328  e5d60032          LDRB     r0,[r6,#0x32]
00032c  e59f1c38          LDR      r1,|L1.3948|
000330  e5d11000          LDRB     r1,[r1,#0]  ; OSRdyGrp
000334  e1800001          ORR      r0,r0,r1
000338  e59f1c2c          LDR      r1,|L1.3948|
00033c  e5c10000          STRB     r0,[r1,#0]  ; OSRdyGrp
;;;1110           OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000340  e5d60030          LDRB     r0,[r6,#0x30]
000344  e59f1c24          LDR      r1,|L1.3952|
000348  e7d10000          LDRB     r0,[r1,r0]
00034c  e5d61031          LDRB     r1,[r6,#0x31]
000350  e1800001          ORR      r0,r0,r1
000354  e5d61030          LDRB     r1,[r6,#0x30]
000358  e59f2c10          LDR      r2,|L1.3952|
00035c  e7c20001          STRB     r0,[r2,r1]
;;;1111           sched                   = OS_TRUE;
000360  e3a07001          MOV      r7,#1
000364  ea000000          B        |L1.876|
                  |L1.872|
;;;1112       } else {
;;;1113           sched                   = OS_FALSE;
000368  e3a07000          MOV      r7,#0
                  |L1.876|
;;;1114       }
;;;1115       OS_FlagUnlink(pnode);
00036c  e1a00004          MOV      r0,r4
000370  ebfffffe          BL       OS_FlagUnlink
;;;1116       return (sched);
000374  e1a00007          MOV      r0,r7
000378  e8bd40f0          POP      {r4-r7,lr}
;;;1117   }
00037c  e12fff1e          BX       lr
                          ENDP

                  OSFlagDel PROC
;;;285    OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
;;;286    {
000380  e92d47f0          PUSH     {r4-r10,lr}
000384  e1a04000          MOV      r4,r0
000388  e1a05001          MOV      r5,r1
00038c  e1a06002          MOV      r6,r2
;;;287        BOOLEAN       tasks_waiting;
;;;288        OS_FLAG_NODE *pnode;
;;;289        OS_FLAG_GRP  *pgrp_return;
;;;290    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;291        OS_CPU_SR     cpu_sr = 0;
000390  e3a0a000          MOV      r10,#0
;;;292    #endif
;;;293    
;;;294    
;;;295    
;;;296    #if OS_ARG_CHK_EN > 0
;;;297        if (err == (INT8U *)0) {                               /* Validate 'err'                           */
000394  e3560000          CMP      r6,#0
000398  1a000002          BNE      |L1.936|
;;;298            return (pgrp);
00039c  e1a00004          MOV      r0,r4
                  |L1.928|
0003a0  e8bd47f0          POP      {r4-r10,lr}
;;;299        }
;;;300        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
;;;301            *err = OS_ERR_FLAG_INVALID_PGRP;
;;;302            return (pgrp);
;;;303        }
;;;304    #endif
;;;305        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;306            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
;;;307            return (pgrp);
;;;308        }
;;;309        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type                */
;;;310            *err = OS_ERR_EVENT_TYPE;
;;;311            return (pgrp);
;;;312        }
;;;313        OS_ENTER_CRITICAL();
;;;314        if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on event flags  */
;;;315            tasks_waiting = OS_TRUE;                           /* Yes                                      */
;;;316        } else {
;;;317            tasks_waiting = OS_FALSE;                          /* No                                       */
;;;318        }
;;;319        switch (opt) {
;;;320            case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
;;;321                 if (tasks_waiting == OS_FALSE) {
;;;322    #if OS_FLAG_NAME_SIZE > 1
;;;323                     pgrp->OSFlagName[0]  = '?';               /* Unknown name                             */
;;;324                     pgrp->OSFlagName[1]  = OS_ASCII_NUL;
;;;325    #endif
;;;326                     pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
;;;327                     pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
;;;328                     pgrp->OSFlagFlags    = (OS_FLAGS)0;
;;;329                     OSFlagFreeList       = pgrp;
;;;330                     OS_EXIT_CRITICAL();
;;;331                     *err                 = OS_ERR_NONE;
;;;332                     pgrp_return          = (OS_FLAG_GRP *)0;  /* Event Flag Group has been deleted        */
;;;333                 } else {
;;;334                     OS_EXIT_CRITICAL();
;;;335                     *err                 = OS_ERR_TASK_WAITING;
;;;336                     pgrp_return          = pgrp;
;;;337                 }
;;;338                 break;
;;;339    
;;;340            case OS_DEL_ALWAYS:                                /* Always delete the event flag group       */
;;;341                 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;;;342                 while (pnode != (OS_FLAG_NODE *)0) {          /* Ready ALL tasks waiting for flags        */
;;;343                     (void)OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
;;;344                     pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
;;;345                 }
;;;346    #if OS_FLAG_NAME_SIZE > 1
;;;347                 pgrp->OSFlagName[0]  = '?';                   /* Unknown name                             */
;;;348                 pgrp->OSFlagName[1]  = OS_ASCII_NUL;
;;;349    #endif
;;;350                 pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
;;;351                 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
;;;352                 pgrp->OSFlagFlags    = (OS_FLAGS)0;
;;;353                 OSFlagFreeList       = pgrp;

⌨️ 快捷键说明

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