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

📄 os_flag.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
0003ac  604e              STR      r6,[r1,#4]
;;;1005       pnode->OSFlagNodeFlagGrp  = (void *)pgrp;         /* Link to Event Flag Group                      */
0003ae  60c8              STR      r0,[r1,#0xc]
;;;1006       pnode_next                = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
0003b0  6842              LDR      r2,[r0,#4]
;;;1007       if (pnode_next != (void *)0) {                    /* Is this the first NODE to insert?             */
0003b2  b102              CBZ      r2,|L1.950|
;;;1008           pnode_next->OSFlagNodePrev = pnode;           /* No, link in doubly linked list                */
0003b4  6051              STR      r1,[r2,#4]
                  |L1.950|
;;;1009       }
;;;1010       pgrp->OSFlagWaitList = (void *)pnode;
0003b6  6041              STR      r1,[r0,#4]
;;;1011   
;;;1012       y            =  OSTCBCur->OSTCBY;                 /* Suspend current task until flag(s) received   */
0003b8  6829              LDR      r1,[r5,#0]  ; OSTCBCur
0003ba  f891f891          LDRB     r0,[r1,#0x30]
;;;1013       OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
0003be  4a48              LDR      r2,|L1.1248|
0003c0  f891f891          LDRB     r12,[r1,#0x31]
0003c4  5c13              LDRB     r3,[r2,r0]
0003c6  ea23ea23          BIC      r3,r3,r12
0003ca  5413              STRB     r3,[r2,r0]
;;;1014       if (OSRdyTbl[y] == 0x00) {
0003cc  5c10              LDRB     r0,[r2,r0]
0003ce  2800              CMP      r0,#0
0003d0  d106              BNE      |L1.992|
;;;1015           OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
0003d2  4842              LDR      r0,|L1.1244|
0003d4  f891f891          LDRB     r1,[r1,#0x32]
0003d8  7802              LDRB     r2,[r0,#0]  ; OSRdyGrp
0003da  ea22ea22          BIC      r1,r2,r1
0003de  7001              STRB     r1,[r0,#0]  ; OSRdyGrp
                  |L1.992|
;;;1016       }
;;;1017   }
0003e0  bc70              POP      {r4-r6}
0003e2  4770              BX       lr
;;;1018   
                          ENDP

                  OSFlagPend PROC
;;;560    OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *perr)
;;;561    {
0003e4  e92de92d          PUSH     {r0-r11,lr}
0003e8  b087              SUB      sp,sp,#0x1c
0003ea  9c14              LDR      r4,[sp,#0x50]
0003ec  4605              MOV      r5,r0
0003ee  460f              MOV      r7,r1
0003f0  4690              MOV      r8,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'                          */
0003f2  b91c              CBNZ     r4,|L1.1020|
;;;575            return ((OS_FLAGS)0);
0003f4  2000              MOVS     r0,#0
0003f6  b00b              ADD      sp,sp,#0x2c
0003f8  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1020|
;;;576        }
;;;577        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
0003fc  b92d              CBNZ     r5,|L1.1034|
;;;578            *perr = OS_ERR_FLAG_INVALID_PGRP;
0003fe  206e              MOVS     r0,#0x6e
000400  7020              STRB     r0,[r4,#0]
;;;579            return ((OS_FLAGS)0);
000402  2000              MOVS     r0,#0
000404  b00b              ADD      sp,sp,#0x2c
000406  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1034|
;;;580        }
;;;581    #endif
;;;582        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
00040a  4832              LDR      r0,|L1.1236|
00040c  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
00040e  b128              CBZ      r0,|L1.1052|
;;;583            *perr = OS_ERR_PEND_ISR;                           /* ... can't PEND from an ISR               */
000410  2002              MOVS     r0,#2
000412  7020              STRB     r0,[r4,#0]
;;;584            return ((OS_FLAGS)0);
000414  2000              MOVS     r0,#0
000416  b00b              ADD      sp,sp,#0x2c
000418  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1052|
;;;585        }
;;;586        if (OSLockNesting > 0) {                               /* See if called with scheduler locked ...  */
00041c  4832              LDR      r0,|L1.1256|
00041e  7800              LDRB     r0,[r0,#0]  ; OSLockNesting
000420  b128              CBZ      r0,|L1.1070|
;;;587            *perr = OS_ERR_PEND_LOCKED;                        /* ... can't PEND when locked               */
000422  200d              MOVS     r0,#0xd
000424  7020              STRB     r0,[r4,#0]
;;;588            return ((OS_FLAGS)0);
000426  2000              MOVS     r0,#0
000428  b00b              ADD      sp,sp,#0x2c
00042a  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1070|
;;;589        }
;;;590        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
00042e  7828              LDRB     r0,[r5,#0]
000430  2805              CMP      r0,#5
000432  d005              BEQ      |L1.1088|
;;;591            *perr = OS_ERR_EVENT_TYPE;
000434  2001              MOVS     r0,#1
000436  7020              STRB     r0,[r4,#0]
;;;592            return ((OS_FLAGS)0);
000438  2000              MOVS     r0,#0
00043a  b00b              ADD      sp,sp,#0x2c
00043c  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1088|
;;;593        }
;;;594        result = (INT8U)(wait_type & OS_FLAG_CONSUME);
000440  f008f008          AND      r0,r8,#0x80
;;;595        if (result != (INT8U)0) {                             /* See if we need to consume the flags      */
000444  b118              CBZ      r0,|L1.1102|
;;;596            wait_type &= ~(INT8U)OS_FLAG_CONSUME;
000446  f028f028          BIC      r8,r8,#0x80
;;;597            consume    = OS_TRUE;
00044a  2601              MOVS     r6,#1
00044c  e000              B        |L1.1104|
                  |L1.1102|
;;;598        } else {
;;;599            consume    = OS_FALSE;
00044e  2600              MOVS     r6,#0
                  |L1.1104|
;;;600        }
;;;601    /*$PAGE*/
;;;602        OS_ENTER_CRITICAL();
000450  f7fff7ff          BL       OS_CPU_SR_Save
000454  9001              STR      r0,[sp,#4]
;;;603        switch (wait_type) {
000456  f8dff8df          LDR      r10,|L1.1252|
00045a  f04ff04f          MOV      r9,#0
00045e  f1b8f1b8          CMP      r8,#0
000462  d05b              BEQ      |L1.1308|
000464  f1b8f1b8          CMP      r8,#1
000468  d07b              BEQ      |L1.1378|
00046a  f1b8f1b8          CMP      r8,#2
00046e  d01a              BEQ      |L1.1190|
000470  f1b8f1b8          CMP      r8,#3
000474  d174              BNE      |L1.1376|
;;;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    */
000476  8928              LDRH     r0,[r5,#8]
000478  ea00ea00          AND      r11,r0,r7
;;;622                 if (flags_rdy != (OS_FLAGS)0) {               /* See if any flag set                      */
00047c  f1bbf1bb          CMP      r11,#0
000480  d040              BEQ      |L1.1284|
;;;623                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
000482  2e01              CMP      r6,#1
000484  d102              BNE      |L1.1164|
;;;624                         pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we got         */
000486  ea20ea20          BIC      r0,r0,r11
00048a  8128              STRH     r0,[r5,#8]
                  |L1.1164|
;;;625                     }
;;;626                     OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
00048c  f8daf8da          LDR      r0,[r10,#0]  ; OSTCBCur
000490  f8a0f8a0          STRH     r11,[r0,#0x28]
;;;627                     OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
000494  9801              LDR      r0,[sp,#4]
000496  f7fff7ff          BL       OS_CPU_SR_Restore
;;;628                     *perr                   = OS_ERR_NONE;
00049a  f884f884          STRB     r9,[r4,#0]
;;;629                     return (flags_rdy);
00049e  4658              MOV      r0,r11
0004a0  b00b              ADD      sp,sp,#0x2c
0004a2  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1190|
0004a6  8928              LDRH     r0,[r5,#8]
0004a8  ea00ea00          AND      r11,r0,r7
0004ac  45bb              CMP      r11,r7
0004ae  d11d              BNE      |L1.1260|
0004b0  2e01              CMP      r6,#1
0004b2  d102              BNE      |L1.1210|
0004b4  ea20ea20          BIC      r0,r0,r11
0004b8  8128              STRH     r0,[r5,#8]
                  |L1.1210|
0004ba  f8daf8da          LDR      r0,[r10,#0]  ; OSTCBCur
0004be  f8a0f8a0          STRH     r11,[r0,#0x28]
0004c2  9801              LDR      r0,[sp,#4]
0004c4  f7fff7ff          BL       OS_CPU_SR_Restore
0004c8  f884f884          STRB     r9,[r4,#0]
0004cc  4658              MOV      r0,r11
                  |L1.1230|
0004ce  b00b              ADD      sp,sp,#0x2c
0004d0  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1236|
0004d4  00000000          DCD      OSIntNesting
                  |L1.1240|
0004d8  00000000          DCD      OSFlagFreeList
                  |L1.1244|
0004dc  00000000          DCD      OSRdyGrp
                  |L1.1248|
0004e0  00000000          DCD      OSRdyTbl
                  |L1.1252|
0004e4  00000000          DCD      OSTCBCur
                  |L1.1256|
0004e8  00000000          DCD      OSLockNesting
                  |L1.1260|
0004ec  9b0a              LDR      r3,[sp,#0x28]
0004ee  9300              STR      r3,[sp,#0]
0004f0  4643              MOV      r3,r8
0004f2  463a              MOV      r2,r7
0004f4  a902              ADD      r1,sp,#8
0004f6  4628              MOV      r0,r5
0004f8  f7fff7ff          BL       OS_FlagBlock
0004fc  9801              LDR      r0,[sp,#4]
0004fe  f7fff7ff          BL       OS_CPU_SR_Restore
000502  e04f              B        |L1.1444|
                  |L1.1284|
;;;630                 } else {                                      /* Block task until events occur or timeout */
;;;631                     OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
000504  9b0a              LDR      r3,[sp,#0x28]
000506  9300              STR      r3,[sp,#0]
000508  4643              MOV      r3,r8
00050a  463a              MOV      r2,r7
00050c  a902              ADD      r1,sp,#8
00050e  4628              MOV      r0,r5
000510  f7fff7ff          BL       OS_FlagBlock
;;;632                     OS_EXIT_CRITICAL();
000514  9801              LDR      r0,[sp,#4]
000516  f7fff7ff          BL       OS_CPU_SR_Restore
00051a  e043              B        |L1.1444|
                  |L1.1308|
;;;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     */
00051c  8928              LDRH     r0,[r5,#8]
00051e  ea27ea27          BIC      r11,r7,r0
;;;639                 if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
000522  45bb              CMP      r11,r7
000524  d10f              BNE      |L1.1350|
;;;640                     if (consume == OS_TRUE) {                 /* See if we need to consume the flags      */
000526  2e01              CMP      r6,#1
000528  d102              BNE      |L1.1328|
;;;641                         pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
00052a  ea40ea40          ORR      r0,r0,r11

⌨️ 快捷键说明

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