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

📄 os_flag.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                          ENDP

                  OSFlagCreate PROC
;;;193    OS_FLAG_GRP  *OSFlagCreate (OS_FLAGS flags, INT8U *err)
;;;194    {
0001c4  e92d4070          PUSH     {r4-r6,lr}
0001c8  e1a04000          MOV      r4,r0
0001cc  e1a06001          MOV      r6,r1
;;;195    #if OS_CRITICAL_METHOD == 3                         /* Allocate storage for CPU status register        */
;;;196        OS_CPU_SR    cpu_sr;
;;;197    #endif    
;;;198        OS_FLAG_GRP *pgrp;
;;;199    
;;;200    
;;;201        if (OSIntNesting > 0) {                         /* See if called from ISR ...                      */
0001d0  e59f095c          LDR      r0,|L1.2868|
0001d4  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0001d8  e3500000          CMP      r0,#0
0001dc  da000003          BLE      |L1.496|
;;;202            *err = OS_ERR_CREATE_ISR;                   /* ... can't CREATE from an ISR                    */
0001e0  e3a0008d          MOV      r0,#0x8d
0001e4  e5c60000          STRB     r0,[r6,#0]
;;;203            return ((OS_FLAG_GRP *)0);               
0001e8  e3a00000          MOV      r0,#0
;;;204        }
;;;205        OS_ENTER_CRITICAL();
;;;206        pgrp = OSFlagFreeList;                          /* Get next free event flag                        */
;;;207        if (pgrp != (OS_FLAG_GRP *)0) {                 /* See if we have event flag groups available      */
;;;208                                                        /* Adjust free list                                */
;;;209            OSFlagFreeList       = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
;;;210            pgrp->OSFlagType     = OS_EVENT_TYPE_FLAG;  /* Set to event flag group type                    */
;;;211            pgrp->OSFlagFlags    = flags;               /* Set to desired initial value                    */
;;;212            pgrp->OSFlagWaitList = (void *)0;           /* Clear list of tasks waiting on flags            */
;;;213            OS_EXIT_CRITICAL();
;;;214            *err                 = OS_NO_ERR;
;;;215        } else {
;;;216            OS_EXIT_CRITICAL();
;;;217            *err                 = OS_FLAG_GRP_DEPLETED;
;;;218        }
;;;219        return (pgrp);                                  /* Return pointer to event flag group              */
;;;220    }
                  |L1.492|
0001ec  e8bd8070          POP      {r4-r6,pc}
                  |L1.496|
0001f0  ef000002          SVC      0x2  ; formerly SWI   ;205
0001f4  e59f093c          LDR      r0,|L1.2872|          ;206
0001f8  e5905000          LDR      r5,[r0,#0]            ;206  ; OSFlagFreeList
0001fc  e3550000          CMP      r5,#0                 ;207
000200  0a00000c          BEQ      |L1.568|              ;207
000204  e5900000          LDR      r0,[r0,#0]            ;209  ; OSFlagFreeList
000208  e5900004          LDR      r0,[r0,#4]            ;209
00020c  e59f1924          LDR      r1,|L1.2872|          ;209
000210  e5810000          STR      r0,[r1,#0]            ;209  ; OSFlagFreeList
000214  e3a00005          MOV      r0,#5                 ;210
000218  e5c50000          STRB     r0,[r5,#0]            ;210
00021c  e1c540b8          STRH     r4,[r5,#8]            ;211
000220  e3a00000          MOV      r0,#0                 ;212
000224  e5850004          STR      r0,[r5,#4]            ;212
000228  ef000003          SVC      0x3  ; formerly SWI   ;213
00022c  e3a00000          MOV      r0,#0                 ;214
000230  e5c60000          STRB     r0,[r6,#0]            ;214
000234  ea000002          B        |L1.580|              ;214
                  |L1.568|
000238  ef000003          SVC      0x3  ; formerly SWI   ;216
00023c  e3a0009a          MOV      r0,#0x9a              ;217
000240  e5c60000          STRB     r0,[r6,#0]            ;217
                  |L1.580|
000244  e1a00005          MOV      r0,r5                 ;219
000248  eaffffe7          B        |L1.492|              ;219
                          ENDP

                  OS_FlagUnlink PROC
;;;868    void  OS_FlagUnlink (OS_FLAG_NODE *pnode)
;;;869    {
00024c  e52de004          PUSH     {lr}
;;;870        OS_TCB       *ptcb;
;;;871        OS_FLAG_GRP  *pgrp;
;;;872        OS_FLAG_NODE *pnode_prev;
;;;873        OS_FLAG_NODE *pnode_next;
;;;874        
;;;875        
;;;876        pnode_prev = pnode->OSFlagNodePrev;
000250  e5903004          LDR      r3,[r0,#4]
;;;877        pnode_next = pnode->OSFlagNodeNext;
000254  e590c000          LDR      r12,[r0,#0]
;;;878        if (pnode_prev == (OS_FLAG_NODE *)0) {                      /* Is it first node in wait list?      */
000258  e3530000          CMP      r3,#0
00025c  1a000006          BNE      |L1.636|
;;;879            pgrp                 = pnode->OSFlagNodeFlagGrp;        /* Yes, Point to event flag group      */
000260  e590200c          LDR      r2,[r0,#0xc]
;;;880            pgrp->OSFlagWaitList = (void *)pnode_next;              /*      Update list for new 1st node   */
000264  e582c004          STR      r12,[r2,#4]
;;;881            if (pnode_next != (OS_FLAG_NODE *)0) {       
000268  e35c0000          CMP      r12,#0
00026c  0a000006          BEQ      |L1.652|
;;;882                pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0;     /*      Link new 1st node PREV to NULL */
000270  e3a0e000          MOV      lr,#0
000274  e58ce004          STR      lr,[r12,#4]
000278  ea000003          B        |L1.652|
;;;883            }
;;;884        } else {                                                    /* No,  A node somewhere in the list   */
;;;885            pnode_prev->OSFlagNodeNext = pnode_next;                /*      Link around the node to unlink */
                  |L1.636|
00027c  e583c000          STR      r12,[r3,#0]
;;;886            if (pnode_next != (OS_FLAG_NODE *)0) {                  /*      Was this the LAST node?        */
000280  e35c0000          CMP      r12,#0
000284  0a000000          BEQ      |L1.652|
;;;887                pnode_next->OSFlagNodePrev = pnode_prev;            /*      No, Link around current node   */
000288  e58c3004          STR      r3,[r12,#4]
;;;888            }
;;;889        }
;;;890        ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;
                  |L1.652|
00028c  e5901008          LDR      r1,[r0,#8]
;;;891    #if OS_TASK_DEL_EN > 0
;;;892        ptcb->OSTCBFlagNode = (void *)0;
000290  e3a0e000          MOV      lr,#0
000294  e581e014          STR      lr,[r1,#0x14]
;;;893    #endif
;;;894    }
000298  e49df004          POP      {pc}
                          ENDP

                  OS_FlagTaskRdy PROC
;;;825    static  BOOLEAN  OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;826    {
00029c  e92d40f0          PUSH     {r4-r7,lr}
0002a0  e1a04000          MOV      r4,r0
0002a4  e1a05001          MOV      r5,r1
;;;827        OS_TCB   *ptcb;
;;;828        BOOLEAN   sched;
;;;829              
;;;830                                                            
;;;831        ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;  /* Point to TCB of waiting task             */
0002a8  e5946008          LDR      r6,[r4,#8]
;;;832        ptcb->OSTCBDly      = 0;
0002ac  e3a00000          MOV      r0,#0
0002b0  e1c601ba          STRH     r0,[r6,#0x1a]
;;;833        ptcb->OSTCBFlagsRdy = flags_rdy;
0002b4  e1c651b8          STRH     r5,[r6,#0x18]
;;;834        ptcb->OSTCBStat    &= ~OS_STAT_FLAG;
0002b8  e5d6001c          LDRB     r0,[r6,#0x1c]
0002bc  e3c00020          BIC      r0,r0,#0x20
0002c0  e5c6001c          STRB     r0,[r6,#0x1c]
;;;835        if (ptcb->OSTCBStat == OS_STAT_RDY) {                  /* Put task into ready list                 */
0002c4  e5d6001c          LDRB     r0,[r6,#0x1c]
0002c8  e3500000          CMP      r0,#0
0002cc  1a00000f          BNE      |L1.784|
;;;836            OSRdyGrp               |= ptcb->OSTCBBitY;
0002d0  e5d60021          LDRB     r0,[r6,#0x21]
0002d4  e59f1860          LDR      r1,|L1.2876|
0002d8  e5d11000          LDRB     r1,[r1,#0]  ; OSRdyGrp
0002dc  e1800001          ORR      r0,r0,r1
0002e0  e59f1854          LDR      r1,|L1.2876|
0002e4  e5c10000          STRB     r0,[r1,#0]  ; OSRdyGrp
;;;837            OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0002e8  e5d6001f          LDRB     r0,[r6,#0x1f]
0002ec  e59f184c          LDR      r1,|L1.2880|
0002f0  e7d10000          LDRB     r0,[r1,r0]
0002f4  e5d61020          LDRB     r1,[r6,#0x20]
0002f8  e1800001          ORR      r0,r0,r1
0002fc  e5d6101f          LDRB     r1,[r6,#0x1f]
000300  e59f2838          LDR      r2,|L1.2880|
000304  e7c20001          STRB     r0,[r2,r1]
;;;838            sched                   = TRUE;
000308  e3a07001          MOV      r7,#1
00030c  ea000000          B        |L1.788|
;;;839        } else {
;;;840            sched                   = FALSE;
                  |L1.784|
000310  e3a07000          MOV      r7,#0
;;;841        }
;;;842        OS_FlagUnlink(pnode);
                  |L1.788|
000314  e1a00004          MOV      r0,r4
000318  ebfffffe          BL       OS_FlagUnlink
;;;843        return (sched);
00031c  e1a00007          MOV      r0,r7
;;;844    }
000320  e8bd80f0          POP      {r4-r7,pc}
                          ENDP

                  OSFlagDel PROC
;;;261    OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
;;;262    {
000324  e92d41f0          PUSH     {r4-r8,lr}
000328  e1a04000          MOV      r4,r0
00032c  e1a05001          MOV      r5,r1
000330  e1a06002          MOV      r6,r2
;;;263    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;264        OS_CPU_SR     cpu_sr;
;;;265    #endif    
;;;266        BOOLEAN       tasks_waiting;
;;;267        OS_FLAG_NODE *pnode;
;;;268    
;;;269    
;;;270        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000334  e59f07f8          LDR      r0,|L1.2868|
000338  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00033c  e3500000          CMP      r0,#0
000340  da000003          BLE      |L1.852|
;;;271            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
000344  e3a0008c          MOV      r0,#0x8c
000348  e5c60000          STRB     r0,[r6,#0]
;;;272            return (pgrp);
00034c  e1a00004          MOV      r0,r4
;;;273        }
;;;274    #if OS_ARG_CHK_EN > 0
;;;275        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
;;;276            *err = OS_FLAG_INVALID_PGRP;
;;;277            return (pgrp);
;;;278        }
;;;279        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type                */
;;;280            *err = OS_ERR_EVENT_TYPE;
;;;281            return (pgrp);
;;;282        }
;;;283    #endif
;;;284        OS_ENTER_CRITICAL();
;;;285        if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on event flags  */
;;;286            tasks_waiting = TRUE;                              /* Yes                                      */
;;;287        } else {
;;;288            tasks_waiting = FALSE;                             /* No                                       */
;;;289        }
;;;290        switch (opt) {
;;;291            case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
;;;292                 if (tasks_waiting == FALSE) {
;;;293                     pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
;;;294                     pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
;;;295                     OSFlagFreeList       = pgrp;
;;;296                     OS_EXIT_CRITICAL();
;;;297                     *err                 = OS_NO_ERR;
;;;298                     return ((OS_FLAG_GRP *)0);                /* Event Flag Group has been deleted        */

⌨️ 快捷键说明

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