os_flag.txt

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

TXT
1,195
字号
;;;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    }
0001a8  e12fff1e          BX       lr
                  |L1.428|
0001ac  ef000002          SVC      #0x2                  ;205
0001b0  e59f07cc          LDR      r0,|L1.2436|
0001b4  e5904000          LDR      r4,[r0,#0]            ;206  ; OSFlagFreeList
0001b8  e3540000          CMP      r4,#0                 ;207
0001bc  0a000009          BEQ      |L1.488|
0001c0  e5941004          LDR      r1,[r4,#4]            ;209
0001c4  e5801000          STR      r1,[r0,#0]            ;209  ; OSFlagFreeList
0001c8  e3a00005          MOV      r0,#5                 ;210
0001cc  e5c40000          STRB     r0,[r4,#0]            ;210
0001d0  e1c460b8          STRH     r6,[r4,#8]            ;211
0001d4  e3a06000          MOV      r6,#0                 ;212
0001d8  e5846004          STR      r6,[r4,#4]            ;212
0001dc  ef000003          SVC      #0x3                  ;213
0001e0  e5c56000          STRB     r6,[r5,#0]            ;214
0001e4  ea000002          B        |L1.500|
                  |L1.488|
0001e8  ef000003          SVC      #0x3                  ;216
0001ec  e3a0009a          MOV      r0,#0x9a              ;217
0001f0  e5c50000          STRB     r0,[r5,#0]            ;217
                  |L1.500|
0001f4  e1a00004          MOV      r0,r4                 ;219
0001f8  eaffffe9          B        |L1.420|
;;;221    
                          ENDP

                  OS_FlagUnlink PROC
;;;876    
;;;877        pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
0001fc  e5902004          LDR      r2,[r0,#4]
;;;878        pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
000200  e5901000          LDR      r1,[r0,#0]
;;;879        if (pnode_prev == (OS_FLAG_NODE *)0) {                      /* Is it first node in wait list?      */
000204  e3520000          CMP      r2,#0
000208  e3a03000          MOV      r3,#0                 ;878
00020c  1a000005          BNE      |L1.552|
;;;880            pgrp                 = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
000210  e590200c          LDR      r2,[r0,#0xc]
;;;881            pgrp->OSFlagWaitList = (void *)pnode_next;              /*      Update list for new 1st node   */
000214  e5821004          STR      r1,[r2,#4]
;;;882            if (pnode_next != (OS_FLAG_NODE *)0) {
000218  e3510000          CMP      r1,#0
00021c  0a000005          BEQ      |L1.568|
;;;883                pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0;     /*      Link new 1st node PREV to NULL */
000220  e5813004          STR      r3,[r1,#4]
000224  ea000003          B        |L1.568|
                  |L1.552|
;;;884            }
;;;885        } else {                                                    /* No,  A node somewhere in the list   */
;;;886            pnode_prev->OSFlagNodeNext = pnode_next;                /*      Link around the node to unlink */
000228  e5821000          STR      r1,[r2,#0]
;;;887            if (pnode_next != (OS_FLAG_NODE *)0) {                  /*      Was this the LAST node?        */
00022c  e3510000          CMP      r1,#0
000230  0a000000          BEQ      |L1.568|
;;;888                pnode_next->OSFlagNodePrev = pnode_prev;            /*      No, Link around current node   */
000234  e5812004          STR      r2,[r1,#4]
                  |L1.568|
;;;889            }
;;;890        }
;;;891    #if OS_TASK_DEL_EN > 0
;;;892        ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;
000238  e5900008          LDR      r0,[r0,#8]
;;;893        ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
00023c  e5803024          STR      r3,[r0,#0x24]
;;;894    #endif
;;;895    }
000240  e12fff1e          BX       lr
;;;896    #endif
                          ENDP

                  OS_FlagTaskRdy PROC
;;;824    static  BOOLEAN  OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;825    {
000244  e92d4010          PUSH     {r4,lr}
;;;826        OS_TCB   *ptcb;
;;;827        BOOLEAN   sched;
;;;828    
;;;829    
;;;830        ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;  /* Point to TCB of waiting task             */
000248  e5902008          LDR      r2,[r0,#8]
;;;831        ptcb->OSTCBDly      = 0;
00024c  e3a03000          MOV      r3,#0
000250  e1c232ba          STRH     r3,[r2,#0x2a]
;;;832        ptcb->OSTCBFlagsRdy = flags_rdy;
000254  e1c212b8          STRH     r1,[r2,#0x28]
;;;833        ptcb->OSTCBStat    &= ~OS_STAT_FLAG;
000258  e5d2102c          LDRB     r1,[r2,#0x2c]
00025c  e3c11020          BIC      r1,r1,#0x20
000260  e5c2102c          STRB     r1,[r2,#0x2c]
;;;834        if (ptcb->OSTCBStat == OS_STAT_RDY) {                  /* Put task into ready list                 */
000264  e5d2102c          LDRB     r1,[r2,#0x2c]
000268  e3510000          CMP      r1,#0
00026c  1a00000c          BNE      |L1.676|
;;;835            OSRdyGrp               |= ptcb->OSTCBBitY;
000270  e59f1710          LDR      r1,|L1.2440|
000274  e5d23031          LDRB     r3,[r2,#0x31]
000278  e5d1c000          LDRB     r12,[r1,#0]  ; OSRdyGrp
00027c  e183300c          ORR      r3,r3,r12
000280  e5c13000          STRB     r3,[r1,#0]  ; OSRdyGrp
;;;836            OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000284  e5d2102f          LDRB     r1,[r2,#0x2f]
000288  e59f36fc          LDR      r3,|L1.2444|
00028c  e5d22030          LDRB     r2,[r2,#0x30]
000290  e7d3c001          LDRB     r12,[r3,r1]
000294  e182200c          ORR      r2,r2,r12
000298  e7c32001          STRB     r2,[r3,r1]
;;;837            sched                   = TRUE;
00029c  e3a04001          MOV      r4,#1
0002a0  ea000000          B        |L1.680|
                  |L1.676|
;;;838        } else {
;;;839            sched                   = FALSE;
0002a4  e3a04000          MOV      r4,#0
                  |L1.680|
;;;840        }
;;;841        OS_FlagUnlink(pnode);
0002a8  ebfffffe          BL       OS_FlagUnlink
;;;842        return (sched);
0002ac  e1a00004          MOV      r0,r4
0002b0  e8bd4010          POP      {r4,lr}
;;;843    }
0002b4  e12fff1e          BX       lr
;;;844    
                          ENDP

                  OSFlagDel PROC
;;;260    OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
;;;261    {
0002b8  e92d47f0          PUSH     {r4-r10,lr}
0002bc  e1a04000          MOV      r4,r0
0002c0  e1a0a001          MOV      r10,r1
0002c4  e1a05002          MOV      r5,r2
;;;262    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;263        OS_CPU_SR     cpu_sr;
;;;264    #endif
;;;265        BOOLEAN       tasks_waiting;
;;;266        OS_FLAG_NODE *pnode;
;;;267    
;;;268    
;;;269        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0002c8  e59f06b0          LDR      r0,|L1.2432|
0002cc  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0002d0  e3500000          CMP      r0,#0
0002d4  0a000004          BEQ      |L1.748|
;;;270            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
0002d8  e3a0008c          MOV      r0,#0x8c
0002dc  e5c50000          STRB     r0,[r5,#0]
;;;271            return (pgrp);
0002e0  e1a00004          MOV      r0,r4
                  |L1.740|
0002e4  e8bd47f0          POP      {r4-r10,lr}
;;;272        }
;;;273    #if OS_ARG_CHK_EN > 0
;;;274        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
;;;275            *err = OS_FLAG_INVALID_PGRP;
;;;276            return (pgrp);
;;;277        }
;;;278        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type                */
;;;279            *err = OS_ERR_EVENT_TYPE;
;;;280            return (pgrp);
;;;281        }
;;;282    #endif
;;;283        OS_ENTER_CRITICAL();
;;;284        if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on event flags  */
;;;285            tasks_waiting = TRUE;                              /* Yes                                      */
;;;286        } else {
;;;287            tasks_waiting = FALSE;                             /* No                                       */
;;;288        }
;;;289        switch (opt) {
;;;290            case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
;;;291                 if (tasks_waiting == FALSE) {
;;;292                     pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
;;;293                     pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
;;;294                     OSFlagFreeList       = pgrp;
;;;295                     OS_EXIT_CRITICAL();
;;;296                     *err                 = OS_NO_ERR;
;;;297                     return ((OS_FLAG_GRP *)0);                /* Event Flag Group has been deleted        */
;;;298                 } else {
;;;299                     OS_EXIT_CRITICAL();
;;;300                     *err                 = OS_ERR_TASK_WAITING;
;;;301                     return (pgrp);
;;;302                 }
;;;303    
;;;304            case OS_DEL_ALWAYS:                                /* Always delete the event flag group       */
;;;305                 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;;;306                 while (pnode != (OS_FLAG_NODE *)0) {          /* Ready ALL tasks waiting for flags        */
;;;307                     OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
;;;308                     pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
;;;309                 }
;;;310                 pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
;;;311                 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
;;;312                 OSFlagFreeList       = pgrp;
;;;313                 OS_EXIT_CRITICAL();
;;;314                 if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiting  */
;;;315                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;316                 }
;;;317                 *err = OS_NO_ERR;
;;;318                 return ((OS_FLAG_GRP *)0);                    /* Event Flag Group has been deleted        */
;;;319    
;;;320            default:
;;;321                 OS_EXIT_CRITICAL();
;;;322                 *err = OS_ERR_INVALID_OPT;
;;;323                 return (pgrp);
;;;324        }
;;;325    }
0002e8  e12fff1e          BX       lr
                  |L1.748|
0002ec  e3540000          CMP      r4,#0                 ;274
0002f0  1a000003          BNE      |L1.772|
0002f4  e3a00096          MOV      r0,#0x96              ;275
0002f8  e5c50000          STRB     r0,[r5,#0]            ;275
0002fc  e1a00004          MOV      r0,r4                 ;276
000300  eafffff7          B        |L1.740|
                  |L1.772|
000304  e5d40000          LDRB     r0,[r4,#0]            ;278
000308  e3500005          CMP      r0,#5                 ;278
00030c  0a000003          BEQ      |L1.800|
000310  e3a00001          MOV      r0,#1                 ;279
000314  e5c50000          STRB     r0,[r5,#0]            ;279
000318  e1a00004          MOV      r0,r4                 ;280
00031c  eafffff0          B        |L1.740|

⌨️ 快捷键说明

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