os_flag.txt

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

TXT
1,195
字号
                  |L1.800|
000320  ef000002          SVC      #0x2                  ;283
000324  e5946004          LDR      r6,[r4,#4]            ;284
000328  e3560000          CMP      r6,#0                 ;284
00032c  0a000001          BEQ      |L1.824|
000330  e3a07001          MOV      r7,#1                 ;285
000334  ea000000          B        |L1.828|
                  |L1.824|
000338  e3a07000          MOV      r7,#0                 ;287
                  |L1.828|
00033c  e59f8640          LDR      r8,|L1.2436|
000340  e35a0000          CMP      r10,#0                ;289
000344  e3a09000          MOV      r9,#0                 ;287
000348  0a000002          BEQ      |L1.856|
00034c  e35a0001          CMP      r10,#1                ;289
000350  1a000020          BNE      |L1.984|
000354  ea000012          B        |L1.932|
                  |L1.856|
000358  e3570000          CMP      r7,#0                 ;291
00035c  1a000007          BNE      |L1.896|
000360  e5c49000          STRB     r9,[r4,#0]            ;292
000364  e5980000          LDR      r0,[r8,#0]            ;293  ; OSFlagFreeList
000368  e5840004          STR      r0,[r4,#4]            ;293
00036c  e5884000          STR      r4,[r8,#0]            ;294  ; OSFlagFreeList
000370  ef000003          SVC      #0x3                  ;295
000374  e5c59000          STRB     r9,[r5,#0]            ;296
000378  e3a00000          MOV      r0,#0                 ;297
00037c  eaffffd8          B        |L1.740|
                  |L1.896|
000380  ef000003          SVC      #0x3                  ;299
000384  e3a00008          MOV      r0,#8                 ;300
000388  e5c50000          STRB     r0,[r5,#0]            ;300
00038c  e1a00004          MOV      r0,r4                 ;301
000390  eaffffd3          B        |L1.740|
                  |L1.916|
000394  e3a01000          MOV      r1,#0                 ;307
000398  e1a00006          MOV      r0,r6                 ;307
00039c  ebfffffe          BL       OS_FlagTaskRdy
0003a0  e5966000          LDR      r6,[r6,#0]            ;308
                  |L1.932|
0003a4  e3560000          CMP      r6,#0                 ;306
0003a8  1afffff9          BNE      |L1.916|
0003ac  e5c49000          STRB     r9,[r4,#0]            ;310
0003b0  e5980000          LDR      r0,[r8,#0]            ;311  ; OSFlagFreeList
0003b4  e5840004          STR      r0,[r4,#4]            ;311
0003b8  e5884000          STR      r4,[r8,#0]            ;312  ; OSFlagFreeList
0003bc  ef000003          SVC      #0x3                  ;313
0003c0  e3570001          CMP      r7,#1                 ;314
0003c4  1a000000          BNE      |L1.972|
0003c8  ebfffffe          BL       OS_Sched
                  |L1.972|
0003cc  e5c59000          STRB     r9,[r5,#0]            ;317
0003d0  e3a00000          MOV      r0,#0                 ;318
0003d4  eaffffc2          B        |L1.740|
                  |L1.984|
0003d8  ef000003          SVC      #0x3                  ;321
0003dc  e3a00007          MOV      r0,#7                 ;322
0003e0  e5c50000          STRB     r0,[r5,#0]            ;322
0003e4  e1a00004          MOV      r0,r4                 ;323
0003e8  eaffffbd          B        |L1.740|
;;;326    #endif
                          ENDP

                  OS_FlagBlock PROC
;;;731    static  void  OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;732    {
0003ec  e92d4030          PUSH     {r4,r5,lr}
0003f0  e59d400c          LDR      r4,[sp,#0xc]
;;;733        OS_FLAG_NODE  *pnode_next;
;;;734    
;;;735    
;;;736        OSTCBCur->OSTCBStat      |= OS_STAT_FLAG;
0003f4  e59fe594          LDR      lr,|L1.2448|
0003f8  e59ec000          LDR      r12,[lr,#0]  ; OSTCBCur
0003fc  e5dc502c          LDRB     r5,[r12,#0x2c]
000400  e3855020          ORR      r5,r5,#0x20
000404  e5cc502c          STRB     r5,[r12,#0x2c]
;;;737        OSTCBCur->OSTCBDly        = timeout;              /* Store timeout in task's TCB                   */
000408  e1cc42ba          STRH     r4,[r12,#0x2a]
;;;738    #if OS_TASK_DEL_EN > 0
;;;739        OSTCBCur->OSTCBFlagNode   = pnode;                /* TCB to link to node                           */
00040c  e58c1024          STR      r1,[r12,#0x24]
;;;740    #endif
;;;741        pnode->OSFlagNodeFlags    = flags;                /* Save the flags that we need to wait for       */
000410  e1c121b0          STRH     r2,[r1,#0x10]
;;;742        pnode->OSFlagNodeWaitType = wait_type;            /* Save the type of wait we are doing            */
000414  e5c13012          STRB     r3,[r1,#0x12]
;;;743        pnode->OSFlagNodeTCB      = (void *)OSTCBCur;     /* Link to task's TCB                            */
000418  e581c008          STR      r12,[r1,#8]
;;;744        pnode->OSFlagNodeNext     = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
00041c  e5902004          LDR      r2,[r0,#4]
000420  e5812000          STR      r2,[r1,#0]
;;;745        pnode->OSFlagNodePrev     = (void *)0;
000424  e3a02000          MOV      r2,#0
000428  e5812004          STR      r2,[r1,#4]
;;;746        pnode->OSFlagNodeFlagGrp  = (void *)pgrp;         /* Link to Event Flag Group                      */
00042c  e581000c          STR      r0,[r1,#0xc]
;;;747        pnode_next                = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
000430  e5902004          LDR      r2,[r0,#4]
;;;748        if (pnode_next != (void *)0) {                    /* Is this the first NODE to insert?             */
000434  e3520000          CMP      r2,#0
000438  0a000000          BEQ      |L1.1088|
;;;749            pnode_next->OSFlagNodePrev = pnode;           /* No, link in doubly linked list                */
00043c  e5821004          STR      r1,[r2,#4]
                  |L1.1088|
;;;750        }
;;;751        pgrp->OSFlagWaitList = (void *)pnode;
000440  e5801004          STR      r1,[r0,#4]
;;;752                                                          /* Suspend current task until flag(s) received   */
;;;753        if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
000444  e59e0000          LDR      r0,[lr,#0]  ; OSTCBCur
000448  e59f353c          LDR      r3,|L1.2444|
00044c  e5d0102f          LDRB     r1,[r0,#0x2f]
000450  e5d0c030          LDRB     r12,[r0,#0x30]
000454  e7d32001          LDRB     r2,[r3,r1]
000458  e1d2200c          BICS     r2,r2,r12
00045c  e7c32001          STRB     r2,[r3,r1]
000460  1a000004          BNE      |L1.1144|
;;;754            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000464  e5d01031          LDRB     r1,[r0,#0x31]
000468  e59f0518          LDR      r0,|L1.2440|
00046c  e5d02000          LDRB     r2,[r0,#0]  ; OSRdyGrp
000470  e1c21001          BIC      r1,r2,r1
000474  e5c01000          STRB     r1,[r0,#0]  ; OSRdyGrp
                  |L1.1144|
;;;755        }
;;;756    }
000478  e8bd4030          POP      {r4,r5,lr}
00047c  e12fff1e          BX       lr
;;;757    
                          ENDP

                  OSFlagPend PROC
;;;377    OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
;;;378    {
000480  e92d47f0          PUSH     {r4-r10,lr}
000484  e24dd018          SUB      sp,sp,#0x18
000488  e59d5038          LDR      r5,[sp,#0x38]
00048c  e1a04000          MOV      r4,r0
000490  e1a07001          MOV      r7,r1
000494  e1a08002          MOV      r8,r2
000498  e1a0a003          MOV      r10,r3
;;;379    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;380        OS_CPU_SR     cpu_sr;
;;;381    #endif
;;;382        OS_FLAG_NODE  node;
;;;383        OS_FLAGS      flags_cur;
;;;384        OS_FLAGS      flags_rdy;
;;;385        BOOLEAN       consume;
;;;386    
;;;387    
;;;388        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
00049c  e59f04dc          LDR      r0,|L1.2432|
0004a0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0004a4  e3500000          CMP      r0,#0
0004a8  0a000005          BEQ      |L1.1220|
;;;389            *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
0004ac  e3a00002          MOV      r0,#2
0004b0  e5c50000          STRB     r0,[r5,#0]
;;;390            return ((OS_FLAGS)0);
0004b4  e3a00000          MOV      r0,#0
                  |L1.1208|
0004b8  e28dd018          ADD      sp,sp,#0x18
0004bc  e8bd47f0          POP      {r4-r10,lr}
;;;391        }
;;;392    #if OS_ARG_CHK_EN > 0
;;;393        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
;;;394            *err = OS_FLAG_INVALID_PGRP;
;;;395            return ((OS_FLAGS)0);
;;;396        }
;;;397        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
;;;398            *err = OS_ERR_EVENT_TYPE;
;;;399            return ((OS_FLAGS)0);
;;;400        }
;;;401    #endif
;;;402        if (wait_type & OS_FLAG_CONSUME) {                     /* See if we need to consume the flags      */
;;;403            wait_type &= ~OS_FLAG_CONSUME;
;;;404            consume    = TRUE;
;;;405        } else {
;;;406            consume    = FALSE;
;;;407        }
;;;408    /*$PAGE*/
;;;409        OS_ENTER_CRITICAL();
;;;410        switch (wait_type) {
;;;411            case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
;;;412                 flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
;;;413                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;;;414                     if (consume == TRUE) {                    /* See if we need to consume the flags      */
;;;415                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
;;;416                     }
;;;417                     flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
;;;418                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;419                     *err      = OS_NO_ERR;
;;;420                     return (flags_cur);
;;;421                 } else {                                      /* Block task until events occur or timeout */
;;;422                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;423                     OS_EXIT_CRITICAL();
;;;424                 }
;;;425                 break;
;;;426    
;;;427            case OS_FLAG_WAIT_SET_ANY:
;;;428                 flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
;;;429                 if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
;;;430                     if (consume == TRUE) {                    /* See if we need to consume the flags      */
;;;431                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
;;;432                     }
;;;433                     flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
;;;434                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;435                     *err      = OS_NO_ERR;
;;;436                     return (flags_cur);
;;;437                 } else {                                      /* Block task until events occur or timeout */
;;;438                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;439                     OS_EXIT_CRITICAL();
;;;440                 }
;;;441                 break;
;;;442    
;;;443    #if OS_FLAG_WAIT_CLR_EN > 0
;;;444            case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
;;;445                 flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
;;;446                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;;;447                     if (consume == TRUE) {                    /* See if we need to consume the flags      */
;;;448                         pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
;;;449                     }
;;;450                     flags_cur = pgrp->OSFlagFlags;            /* Will return the state of the group       */
;;;451                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;452                     *err      = OS_NO_ERR;
;;;453                     return (flags_cur);
;;;454                 } else {                                      /* Block task until events occur or timeout */
;;;455                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;456                     OS_EXIT_CRITICAL();
;;;457                 }
;;;458                 break;
;;;459    
;;;460            case OS_FLAG_WAIT_CLR_ANY:
;;;461                 flags_rdy = ~pgrp->OSFlagFlags & flags;       /* Extract only the bits we want            */
;;;462                 if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag cleared                  */
;;;463                     if (consume == TRUE) {                    /* See if we need to consume the flags      */
;;;464                         pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we got           */
;;;465                     }

⌨️ 快捷键说明

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