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

📄 os_flag.txt

📁 stm32 ucos 精简移殖版本 不需作任何修改直接便可运行。包含串口 定时器
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000302  f844f844          STR      r1,[r4],#-0x28
;;;999    #endif
;;;1000       pnode->OSFlagNodeFlags    = flags;                /* Save the flags that we need to wait for       */
000306  820a              STRH     r2,[r1,#0x10]
;;;1001       pnode->OSFlagNodeWaitType = wait_type;            /* Save the type of wait we are doing            */
000308  748b              STRB     r3,[r1,#0x12]
;;;1002       pnode->OSFlagNodeTCB      = (void *)OSTCBCur;     /* Link to task's TCB                            */
00030a  608c              STR      r4,[r1,#8]
;;;1003       pnode->OSFlagNodeNext     = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
00030c  6842              LDR      r2,[r0,#4]
00030e  600a              STR      r2,[r1,#0]
;;;1004       pnode->OSFlagNodePrev     = (void *)0;
000310  604e              STR      r6,[r1,#4]
;;;1005       pnode->OSFlagNodeFlagGrp  = (void *)pgrp;         /* Link to Event Flag Group                      */
000312  60c8              STR      r0,[r1,#0xc]
;;;1006       pnode_next                = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
000314  6842              LDR      r2,[r0,#4]
;;;1007       if (pnode_next != (void *)0) {                    /* Is this the first NODE to insert?             */
000316  b102              CBZ      r2,|L1.794|
;;;1008           pnode_next->OSFlagNodePrev = pnode;           /* No, link in doubly linked list                */
000318  6051              STR      r1,[r2,#4]
                  |L1.794|
;;;1009       }
;;;1010       pgrp->OSFlagWaitList = (void *)pnode;
00031a  6041              STR      r1,[r0,#4]
;;;1011   
;;;1012       y            =  OSTCBCur->OSTCBY;                 /* Suspend current task until flag(s) received   */
00031c  6829              LDR      r1,[r5,#0]  ; OSTCBCur
00031e  f891f891          LDRB     r0,[r1,#0x34]
;;;1013       OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
000322  4a65              LDR      r2,|L1.1208|
000324  f891f891          LDRB     r4,[r1,#0x35]
000328  5c13              LDRB     r3,[r2,r0]
00032a  43a3              BICS     r3,r3,r4
00032c  5413              STRB     r3,[r2,r0]
;;;1014       if (OSRdyTbl[y] == 0x00) {
00032e  5c10              LDRB     r0,[r2,r0]
000330  2800              CMP      r0,#0
000332  d105              BNE      |L1.832|
;;;1015           OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000334  f891f891          LDRB     r2,[r1,#0x36]
000338  495e              LDR      r1,|L1.1204|
00033a  7808              LDRB     r0,[r1,#0]  ; OSRdyGrp
00033c  4390              BICS     r0,r0,r2
00033e  7008              STRB     r0,[r1,#0]  ; OSRdyGrp
                  |L1.832|
;;;1016       }
;;;1017   }
000340  bdf0              POP      {r4-r7,pc}
;;;1018   
                          ENDP

                  OSFlagPend PROC
;;;560    OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *perr)
;;;561    {
000342  e92de92d          PUSH     {r0-r11,lr}
000346  b087              SUB      sp,sp,#0x1c
000348  9d14              LDR      r5,[sp,#0x50]
00034a  4604              MOV      r4,r0
00034c  460f              MOV      r7,r1
00034e  4691              MOV      r9,r2
;;;562        OS_FLAG_NODE  node;
;;;563        OS_FLAGS      flags_rdy;
;;;564        INT8U         result;
;;;565        INT8U         pend_stat;
;;;566        BOOLEAN       consume;
;;;567    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;568        OS_CPU_SR     cpu_sr = 0;
;;;569    #endif
;;;570    
;;;571    
;;;572    
;;;573    #if OS_ARG_CHK_EN > 0
;;;574        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;575            return ((OS_FLAGS)0);
;;;576        }
;;;577        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
;;;578            *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;579            return ((OS_FLAGS)0);
;;;580        }
;;;581    #endif
;;;582        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000350  4856              LDR      r0,|L1.1196|
000352  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
000354  b128              CBZ      r0,|L1.866|
;;;583            *perr = OS_ERR_PEND_ISR;                           /* ... can't PEND from an ISR               */
000356  2002              MOVS     r0,#2
000358  7028              STRB     r0,[r5,#0]
;;;584            return ((OS_FLAGS)0);
00035a  2000              MOVS     r0,#0
                  |L1.860|
;;;585        }
;;;586        if (OSLockNesting > 0) {                               /* See if called with scheduler locked ...  */
;;;587            *perr = OS_ERR_PEND_LOCKED;                        /* ... can't PEND when locked               */
;;;588            return ((OS_FLAGS)0);
;;;589        }
;;;590        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
;;;591            *perr = OS_ERR_EVENT_TYPE;
;;;592            return ((OS_FLAGS)0);
;;;593        }
;;;594        result = (INT8U)(wait_type & OS_FLAG_CONSUME);
;;;595        if (result != (INT8U)0) {                             /* See if we need to consume the flags      */
;;;596            wait_type &= ~(INT8U)OS_FLAG_CONSUME;
;;;597            consume    = OS_TRUE;
;;;598        } else {
;;;599            consume    = OS_FALSE;
;;;600        }
;;;601    /*$PAGE*/
;;;602        OS_ENTER_CRITICAL();
;;;603        switch (wait_type) {
;;;604            case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
;;;605                 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags);   /* Extract only the bits we want     */
;;;606                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;;;607                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;608                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
;;;609                     }
;;;610                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;611                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;612                     *perr                   = OS_ERR_NONE;
;;;613                     return (flags_rdy);
;;;614                 } else {                                      /* Block task until events occur or timeout */
;;;615                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;616                     OS_EXIT_CRITICAL();
;;;617                 }
;;;618                 break;
;;;619    
;;;620            case OS_FLAG_WAIT_SET_ANY:
;;;621                 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags);    /* Extract only the bits we want    */
;;;622                 if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
;;;623                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;624                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
;;;625                     }
;;;626                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;627                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;628                     *perr                   = OS_ERR_NONE;
;;;629                     return (flags_rdy);
;;;630                 } else {                                      /* Block task until events occur or timeout */
;;;631                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;632                     OS_EXIT_CRITICAL();
;;;633                 }
;;;634                 break;
;;;635    
;;;636    #if OS_FLAG_WAIT_CLR_EN > 0
;;;637            case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
;;;638                 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags);  /* Extract only the bits we want     */
;;;639                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
;;;640                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;641                         pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
;;;642                     }
;;;643                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;644                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;645                     *perr                   = OS_ERR_NONE;
;;;646                     return (flags_rdy);
;;;647                 } else {                                      /* Block task until events occur or timeout */
;;;648                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;649                     OS_EXIT_CRITICAL();
;;;650                 }
;;;651                 break;
;;;652    
;;;653            case OS_FLAG_WAIT_CLR_ANY:
;;;654                 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want      */
;;;655                 if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag cleared                  */
;;;656                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
;;;657                         pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we got           */
;;;658                     }
;;;659                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
;;;660                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
;;;661                     *perr                   = OS_ERR_NONE;
;;;662                     return (flags_rdy);
;;;663                 } else {                                      /* Block task until events occur or timeout */
;;;664                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;665                     OS_EXIT_CRITICAL();
;;;666                 }
;;;667                 break;
;;;668    #endif
;;;669    
;;;670            default:
;;;671                 OS_EXIT_CRITICAL();
;;;672                 flags_rdy = (OS_FLAGS)0;
;;;673                 *perr      = OS_ERR_FLAG_WAIT_TYPE;
;;;674                 return (flags_rdy);
;;;675        }
;;;676    /*$PAGE*/
;;;677        OS_Sched();                                            /* Find next HPT ready to run               */
;;;678        OS_ENTER_CRITICAL();
;;;679        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) {      /* Have we timed-out or aborted?            */
;;;680            pend_stat                = OSTCBCur->OSTCBStatPend;
;;;681            OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;682            OS_FlagUnlink(&node);
;;;683            OSTCBCur->OSTCBStat      = OS_STAT_RDY;            /* Yes, make task ready-to-run              */
;;;684            OS_EXIT_CRITICAL();
;;;685            flags_rdy                = (OS_FLAGS)0;
;;;686            switch (pend_stat) {
;;;687                case OS_STAT_PEND_ABORT:
;;;688                     *perr = OS_ERR_PEND_ABORT;                 /* Indicate that we aborted   waiting       */
;;;689                     break;
;;;690    
;;;691                case OS_STAT_PEND_TO:
;;;692                default:
;;;693                     *perr = OS_ERR_TIMEOUT;                    /* Indicate that we timed-out waiting       */
;;;694                     break;
;;;695            }
;;;696            return (flags_rdy);
;;;697        }
;;;698        flags_rdy = OSTCBCur->OSTCBFlagsRdy;
;;;699        if (consume == OS_TRUE) {                              /* See if we need to consume the flags      */
;;;700            switch (wait_type) {
;;;701                case OS_FLAG_WAIT_SET_ALL:
;;;702                case OS_FLAG_WAIT_SET_ANY:                     /* Clear ONLY the flags we got              */
;;;703                     pgrp->OSFlagFlags &= ~flags_rdy;
;;;704                     break;
;;;705    
;;;706    #if OS_FLAG_WAIT_CLR_EN > 0
;;;707                case OS_FLAG_WAIT_CLR_ALL:
;;;708                case OS_FLAG_WAIT_CLR_ANY:                     /* Set   ONLY the flags we got              */
;;;709                     pgrp->OSFlagFlags |=  flags_rdy;
;;;710                     break;
;;;711    #endif
;;;712                default:
;;;713                     OS_EXIT_CRITICAL();
;;;714                     *perr = OS_ERR_FLAG_WAIT_TYPE;
;;;715                     return ((OS_FLAGS)0);
;;;716            }
;;;717        }
;;;718        OS_EXIT_CRITICAL();
;;;719        *perr = OS_ERR_NONE;                                   /* Event(s) must have occurred              */
;;;720        return (flags_rdy);
;;;721    }
00035c  b00b              ADD      sp,sp,#0x2c
00035e  e8bde8bd          POP      {r4-r11,pc}
                  |L1.866|
000362  4857              LDR      r0,|L1.1216|
000364  7800              LDRB     r0,[r0,#0]            ;586  ; OSLockNesting
000366  b118              CBZ      r0,|L1.880|
000368  200d              MOVS     r0,#0xd               ;587
00036a  7028              STRB     r0,[r5,#0]            ;587
00036c  2000              MOVS     r0,#0                 ;588
00036e  e7f5              B        |L1.860|
                  |L1.880|
000370  7820              LDRB     r0,[r4,#0]            ;590
000372  2805              CMP      r0,#5                 ;590
000374  d003              BEQ      |L1.894|
000376  2001              MOVS     r0,#1                 ;591
000378  7028              STRB     r0,[r5,#0]            ;591
00037a  2000              MOVS     r0,#0                 ;592
00037c  e7ee              B        |L1.860|
                  |L1.894|

⌨️ 快捷键说明

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