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

📄 os_flag.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;299                 } else {
;;;300                     OS_EXIT_CRITICAL();
;;;301                     *err                 = OS_ERR_TASK_WAITING;
;;;302                     return (pgrp);
;;;303                 }
;;;304    
;;;305            case OS_DEL_ALWAYS:                                /* Always delete the event flag group       */
;;;306                 pnode = pgrp->OSFlagWaitList;
;;;307                 while (pnode != (OS_FLAG_NODE *)0) {          /* Ready ALL tasks waiting for flags        */
;;;308                     OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
;;;309                     pnode = pnode->OSFlagNodeNext;
;;;310                 }
;;;311                 pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
;;;312                 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
;;;313                 OSFlagFreeList       = pgrp;
;;;314                 OS_EXIT_CRITICAL();
;;;315                 if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
;;;316                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;317                 }
;;;318                 *err = OS_NO_ERR;
;;;319                 return ((OS_FLAG_GRP *)0);                    /* Event Flag Group has been deleted        */
;;;320    
;;;321            default:
;;;322                 OS_EXIT_CRITICAL();
;;;323                 *err = OS_ERR_INVALID_OPT;
;;;324                 return (pgrp);
;;;325        }
;;;326    }
                  |L1.848|
000350  e8bd81f0          POP      {r4-r8,pc}
                  |L1.852|
000354  e3540000          CMP      r4,#0                 ;275
000358  1a000003          BNE      |L1.876|              ;275
00035c  e3a00096          MOV      r0,#0x96              ;276
000360  e5c60000          STRB     r0,[r6,#0]            ;276
000364  e1a00004          MOV      r0,r4                 ;277
000368  eafffff8          B        |L1.848|              ;277
                  |L1.876|
00036c  e5d40000          LDRB     r0,[r4,#0]            ;279
000370  e3500005          CMP      r0,#5                 ;279
000374  0a000003          BEQ      |L1.904|              ;279
000378  e3a00001          MOV      r0,#1                 ;280
00037c  e5c60000          STRB     r0,[r6,#0]            ;280
000380  e1a00004          MOV      r0,r4                 ;281
000384  eafffff1          B        |L1.848|              ;281
                  |L1.904|
000388  ef000002          SVC      0x2  ; formerly SWI   ;284
00038c  e5940004          LDR      r0,[r4,#4]            ;285
000390  e3500000          CMP      r0,#0                 ;285
000394  0a000001          BEQ      |L1.928|              ;285
000398  e3a07001          MOV      r7,#1                 ;286
00039c  ea000000          B        |L1.932|              ;286
                  |L1.928|
0003a0  e3a07000          MOV      r7,#0                 ;288
                  |L1.932|
0003a4  e3550000          CMP      r5,#0                 ;290
0003a8  0a000002          BEQ      |L1.952|              ;290
0003ac  e3550001          CMP      r5,#1                 ;290
0003b0  1a00002a          BNE      |L1.1120|             ;290
0003b4  ea000012          B        |L1.1028|             ;290
                  |L1.952|
0003b8  e1a00000          MOV      r0,r0                 ;291
0003bc  e3570000          CMP      r7,#0                 ;292
0003c0  1a00000a          BNE      |L1.1008|             ;292
0003c4  e3a00000          MOV      r0,#0                 ;293
0003c8  e5c40000          STRB     r0,[r4,#0]            ;293
0003cc  e59f0764          LDR      r0,|L1.2872|          ;294
0003d0  e5900000          LDR      r0,[r0,#0]            ;294  ; OSFlagFreeList
0003d4  e5840004          STR      r0,[r4,#4]            ;294
0003d8  e59f0758          LDR      r0,|L1.2872|          ;295
0003dc  e5804000          STR      r4,[r0,#0]            ;295  ; OSFlagFreeList
0003e0  ef000003          SVC      0x3  ; formerly SWI   ;296
0003e4  e3a00000          MOV      r0,#0                 ;297
0003e8  e5c60000          STRB     r0,[r6,#0]            ;297
0003ec  eaffffd7          B        |L1.848|              ;298
                  |L1.1008|
0003f0  ef000003          SVC      0x3  ; formerly SWI   ;300
0003f4  e3a00008          MOV      r0,#8                 ;301
0003f8  e5c60000          STRB     r0,[r6,#0]            ;301
0003fc  e1a00004          MOV      r0,r4                 ;302
000400  eaffffd2          B        |L1.848|              ;302
                  |L1.1028|
000404  e1a00000          MOV      r0,r0                 ;305
000408  e5948004          LDR      r8,[r4,#4]            ;306
00040c  ea000003          B        |L1.1056|             ;307
                  |L1.1040|
000410  e3a01000          MOV      r1,#0                 ;308
000414  e1a00008          MOV      r0,r8                 ;308
000418  ebfffffe          BL       OS_FlagTaskRdy        ;308
00041c  e5988000          LDR      r8,[r8,#0]            ;309
                  |L1.1056|
000420  e3580000          CMP      r8,#0                 ;307
000424  1afffff9          BNE      |L1.1040|             ;307
000428  e3a00000          MOV      r0,#0                 ;311
00042c  e5c40000          STRB     r0,[r4,#0]            ;311
000430  e59f0700          LDR      r0,|L1.2872|          ;312
000434  e5900000          LDR      r0,[r0,#0]            ;312  ; OSFlagFreeList
000438  e5840004          STR      r0,[r4,#4]            ;312
00043c  e59f06f4          LDR      r0,|L1.2872|          ;313
000440  e5804000          STR      r4,[r0,#0]            ;313  ; OSFlagFreeList
000444  ef000003          SVC      0x3  ; formerly SWI   ;314
000448  e3570001          CMP      r7,#1                 ;315
00044c  1a000000          BNE      |L1.1108|             ;315
000450  ebfffffe          BL       OS_Sched              ;316
                  |L1.1108|
000454  e3a00000          MOV      r0,#0                 ;318
000458  e5c60000          STRB     r0,[r6,#0]            ;318
00045c  eaffffbb          B        |L1.848|              ;319
                  |L1.1120|
000460  e1a00000          MOV      r0,r0                 ;321
000464  ef000003          SVC      0x3  ; formerly SWI   ;322
000468  e3a00007          MOV      r0,#7                 ;323
00046c  e5c60000          STRB     r0,[r6,#0]            ;323
000470  e1a00004          MOV      r0,r4                 ;324
000474  eaffffb5          B        |L1.848|              ;324
                          ENDP

                  OS_FlagBlock PROC
;;;732    static  void  OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;733    {
000478  e92d4070          PUSH     {r4-r6,lr}
00047c  e59dc010          LDR      r12,[sp,#0x10]
;;;734        OS_FLAG_NODE  *pnode_next;
;;;735    
;;;736    
;;;737        OSTCBCur->OSTCBStat      |= OS_STAT_FLAG;
000480  e59f46bc          LDR      r4,|L1.2884|
000484  e5944000          LDR      r4,[r4,#0]  ; OSTCBCur
000488  e5d4401c          LDRB     r4,[r4,#0x1c]
00048c  e3844020          ORR      r4,r4,#0x20
000490  e59f56ac          LDR      r5,|L1.2884|
000494  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
000498  e5c5401c          STRB     r4,[r5,#0x1c]
;;;738        OSTCBCur->OSTCBDly        = timeout;              /* Store timeout in task's TCB                   */
00049c  e59f46a0          LDR      r4,|L1.2884|
0004a0  e5944000          LDR      r4,[r4,#0]  ; OSTCBCur
0004a4  e1c4c1ba          STRH     r12,[r4,#0x1a]
;;;739    #if OS_TASK_DEL_EN > 0
;;;740        OSTCBCur->OSTCBFlagNode   = pnode;                /* TCB to link to node                           */
0004a8  e59f4694          LDR      r4,|L1.2884|
0004ac  e5944000          LDR      r4,[r4,#0]  ; OSTCBCur
0004b0  e5841014          STR      r1,[r4,#0x14]
;;;741    #endif    
;;;742        pnode->OSFlagNodeFlags    = flags;                /* Save the flags that we need to wait for       */
0004b4  e1c121b0          STRH     r2,[r1,#0x10]
;;;743        pnode->OSFlagNodeWaitType = wait_type;            /* Save the type of wait we are doing            */
0004b8  e5c13012          STRB     r3,[r1,#0x12]
;;;744        pnode->OSFlagNodeTCB      = (void *)OSTCBCur;     /* Link to task's TCB                            */
0004bc  e59f4680          LDR      r4,|L1.2884|
0004c0  e5944000          LDR      r4,[r4,#0]  ; OSTCBCur
0004c4  e5814008          STR      r4,[r1,#8]
;;;745        pnode->OSFlagNodeNext     = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
0004c8  e5904004          LDR      r4,[r0,#4]
0004cc  e5814000          STR      r4,[r1,#0]
;;;746        pnode->OSFlagNodePrev     = (void *)0;
0004d0  e3a04000          MOV      r4,#0
0004d4  e5814004          STR      r4,[r1,#4]
;;;747        pnode->OSFlagNodeFlagGrp  = (void *)pgrp;         /* Link to Event Flag Group                      */
0004d8  e581000c          STR      r0,[r1,#0xc]
;;;748        pnode_next                = pgrp->OSFlagWaitList;
0004dc  e590e004          LDR      lr,[r0,#4]
;;;749        if (pnode_next != (void *)0) {                    /* Is this the first NODE to insert?             */
0004e0  e35e0000          CMP      lr,#0
0004e4  0a000000          BEQ      |L1.1260|
;;;750            pnode_next->OSFlagNodePrev = pnode;           /* No, link in doubly linked list                */
0004e8  e58e1004          STR      r1,[lr,#4]
;;;751        } 
;;;752        pgrp->OSFlagWaitList = (void *)pnode;
                  |L1.1260|
0004ec  e5801004          STR      r1,[r0,#4]
;;;753                                                          /* Suspend current task until flag(s) received   */
;;;754        if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
0004f0  e59f464c          LDR      r4,|L1.2884|
0004f4  e5944000          LDR      r4,[r4,#0]  ; OSTCBCur
0004f8  e5d4401f          LDRB     r4,[r4,#0x1f]
0004fc  e59f563c          LDR      r5,|L1.2880|
000500  e7d54004          LDRB     r4,[r5,r4]
000504  e59f5638          LDR      r5,|L1.2884|
000508  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
00050c  e5d55020          LDRB     r5,[r5,#0x20]
000510  e1c44005          BIC      r4,r4,r5
000514  e21440ff          ANDS     r4,r4,#0xff
000518  e59f5624          LDR      r5,|L1.2884|
00051c  e5955000          LDR      r5,[r5,#0]  ; OSTCBCur
000520  e5d5501f          LDRB     r5,[r5,#0x1f]
000524  e59f6614          LDR      r6,|L1.2880|
000528  e7c64005          STRB     r4,[r6,r5]
00052c  1a000007          BNE      |L1.1360|
;;;755            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000530  e59f460c          LDR      r4,|L1.2884|
000534  e5944000          LDR      r4,[r4,#0]  ; OSTCBCur
000538  e5d44021          LDRB     r4,[r4,#0x21]
00053c  e59f55f8          LDR      r5,|L1.2876|
000540  e5d55000          LDRB     r5,[r5,#0]  ; OSRdyGrp
000544  e1c54004          BIC      r4,r5,r4
000548  e59f55ec          LDR      r5,|L1.2876|
00054c  e5c54000          STRB     r4,[r5,#0]  ; OSRdyGrp
;;;756        }
;;;757    }
                  |L1.1360|
000550  e8bd8070          POP      {r4-r6,pc}
                          ENDP

                  OSFlagPend PROC
;;;378    OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
;;;379    {
000554  e92d4ff0          PUSH     {r4-r11,lr}
000558  e24dd01c          SUB      sp,sp,#0x1c
00055c  e1a04000          MOV      r4,r0
000560  e1a05001          MOV      r5,r1
000564  e1a06002          MOV      r6,r2
000568  e1a07003          MOV      r7,r3
00056c  e59d8040          LDR      r8,[sp,#0x40]
;;;380    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;381        OS_CPU_SR     cpu_sr;
;;;382    #endif    
;;;383        OS_FLAG_NODE  node;
;;;384        OS_FLAGS      flags_cur;
;;;385        OS_FLAGS      flags_rdy;
;;;386        BOOLEAN       consume;
;;;387    
;;;388    
;;;389        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000570  e59f05bc          LDR      r0,|L1.2868|
000574  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000578  e3500000          CMP      r0,#0
00057c  da000004          BLE      |L1.1428|
;;;390            *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
000580  e3a00002          MOV      r0,#2
000584  e5c80000          STRB     r0,[r8,#0]
;;;391            return ((OS_FLAGS)0);
000588  e3a00000          MOV      r0,#0

⌨️ 快捷键说明

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