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

📄 os_flag.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;246    
                          ENDP

                  OS_FlagUnlink PROC
000184  e8900006          LDM      r0,{r1,r2}            ;0
000188  e3a03000          MOV      r3,#0                 ;0
00018c  e3520000          CMP      r2,#0                 ;0
000190  1a000004          BNE      |L1.424|
000194  e590200c          LDR      r2,[r0,#0xc]          ;0
000198  e3510000          CMP      r1,#0                 ;0
00019c  e5821004          STR      r1,[r2,#4]            ;0
0001a0  15813004          STRNE    r3,[r1,#4]            ;0
0001a4  ea000002          B        |L1.436|
                  |L1.424|
0001a8  e3510000          CMP      r1,#0                 ;0
0001ac  e5821000          STR      r1,[r2,#0]            ;0
0001b0  15812004          STRNE    r2,[r1,#4]            ;0
                  |L1.436|
0001b4  e5900008          LDR      r0,[r0,#8]            ;0
0001b8  e5803024          STR      r3,[r0,#0x24]         ;0
0001bc  e12fff1e          BX       lr                    ;0
                          ENDP

                  OS_FlagTaskRdy PROC
;;;1101   static  BOOLEAN  OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;1102   {
0001c0  e52de004          PUSH     {lr}
;;;1103       OS_TCB   *ptcb;
;;;1104       BOOLEAN   sched;
;;;1105   
;;;1106   
;;;1107       ptcb                 = (OS_TCB *)pnode->OSFlagNodeTCB; /* Point to TCB of waiting task             */
;;;1108       ptcb->OSTCBDly       = 0;
0001c4  e5902008          LDR      r2,[r0,#8]
0001c8  e3a03000          MOV      r3,#0
0001cc  e1c232ba          STRH     r3,[r2,#0x2a]
;;;1109       ptcb->OSTCBFlagsRdy  = flags_rdy;
0001d0  e1c212b8          STRH     r1,[r2,#0x28]
;;;1110       ptcb->OSTCBStat     &= ~(INT8U)OS_STAT_FLAG;
0001d4  e5d2102c          LDRB     r1,[r2,#0x2c]
0001d8  e3c11020          BIC      r1,r1,#0x20
;;;1111       ptcb->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;1112       if (ptcb->OSTCBStat == OS_STAT_RDY) {                  /* Task now ready?                          */
0001dc  e31100ff          TST      r1,#0xff
0001e0  e5c2102c          STRB     r1,[r2,#0x2c]         ;1110
;;;1113           OSRdyGrp               |= ptcb->OSTCBBitY;         /* Put task into ready list                 */
;;;1114           OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;1115           sched                   = OS_TRUE;
;;;1116       } else {
;;;1117           sched                   = OS_FALSE;
0001e4  13a0c000          MOVNE    r12,#0
0001e8  e5c2302d          STRB     r3,[r2,#0x2d]         ;1111
0001ec  1a00000b          BNE      |L1.544|
0001f0  e59f16f8          LDR      r1,|L1.2288|
0001f4  e5d23032          LDRB     r3,[r2,#0x32]         ;1113
0001f8  e5d1c000          LDRB     r12,[r1,#0]           ;1113  ; OSRdyGrp
0001fc  e183300c          ORR      r3,r3,r12             ;1113
000200  e5c13000          STRB     r3,[r1,#0]            ;1113  ; OSRdyGrp
000204  e5d21030          LDRB     r1,[r2,#0x30]         ;1114
000208  e59f36e4          LDR      r3,|L1.2292|
00020c  e5d22031          LDRB     r2,[r2,#0x31]         ;1114
000210  e7d3c001          LDRB     r12,[r3,r1]           ;1114
000214  e182200c          ORR      r2,r2,r12             ;1114
000218  e3a0c001          MOV      r12,#1                ;1115
00021c  e7c32001          STRB     r2,[r3,r1]            ;1114
                  |L1.544|
;;;1118       }
;;;1119       OS_FlagUnlink(pnode);
000220  ebfffffe          BL       OS_FlagUnlink
;;;1120       return (sched);
000224  e49de004          POP      {lr}
000228  e1a0000c          MOV      r0,r12
;;;1121   }
00022c  e12fff1e          BX       lr
;;;1122   
                          ENDP

                  OSFlagDel PROC
;;;285    OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *perr)
;;;286    {
000230  e92d5ff0          PUSH     {r4-r12,lr}
000234  e1a04000          MOV      r4,r0
;;;287        BOOLEAN       tasks_waiting;
;;;288        OS_FLAG_NODE *pnode;
;;;289        OS_FLAG_GRP  *pgrp_return;
;;;290    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;291        OS_CPU_SR     cpu_sr = 0;
;;;292    #endif
;;;293    
;;;294    
;;;295    
;;;296    #if OS_ARG_CHK_EN > 0
;;;297        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;298            return (pgrp);
;;;299        }
;;;300        if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
;;;301            *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;302            return (pgrp);
;;;303        }
;;;304    #endif
;;;305        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000238  e59f06a8          LDR      r0,|L1.2280|
00023c  e1a09001          MOV      r9,r1                 ;286
000240  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000244  e1a06002          MOV      r6,r2                 ;286
000248  e3500000          CMP      r0,#0
;;;306            *perr = OS_ERR_DEL_ISR;                            /* ... can't DELETE from an ISR             */
00024c  13a0000f          MOVNE    r0,#0xf
;;;307            return (pgrp);
000250  1a00001f          BNE      |L1.724|
;;;308        }
;;;309        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event group type                */
000254  e5d40000          LDRB     r0,[r4,#0]
000258  e3500005          CMP      r0,#5
;;;310            *perr = OS_ERR_EVENT_TYPE;
00025c  13a00001          MOVNE    r0,#1
;;;311            return (pgrp);
000260  1a00001b          BNE      |L1.724|
;;;312        }
;;;313        OS_ENTER_CRITICAL();
000264  ebfffffe          BL       OS_CPU_SR_Save
;;;314        if (pgrp->OSFlagWaitList != (void *)0) {               /* See if any tasks waiting on event flags  */
000268  e5945004          LDR      r5,[r4,#4]
00026c  e1a08000          MOV      r8,r0                 ;313
000270  e2957000          ADDS     r7,r5,#0
;;;315            tasks_waiting = OS_TRUE;                           /* Yes                                      */
000274  13a07001          MOVNE    r7,#1
;;;316        } else {
;;;317            tasks_waiting = OS_FALSE;                          /* No                                       */
;;;318        }
;;;319        switch (opt) {
000278  e59fa66c          LDR      r10,|L1.2284|
00027c  e1b00009          MOVS     r0,r9
000280  e3a0903f          MOV      r9,#0x3f
000284  e3a0b000          MOV      r11,#0
000288  0a000002          BEQ      |L1.664|
00028c  e3500001          CMP      r0,#1
000290  1a000027          BNE      |L1.820|
000294  ea000016          B        |L1.756|
                  |L1.664|
;;;320            case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
;;;321                 if (tasks_waiting == OS_FALSE) {
000298  e3570000          CMP      r7,#0
00029c  1a000009          BNE      |L1.712|
;;;322    #if OS_FLAG_NAME_SIZE > 1
;;;323                     pgrp->OSFlagName[0]  = '?';               /* Unknown name                             */
0002a0  e5c4900a          STRB     r9,[r4,#0xa]
;;;324                     pgrp->OSFlagName[1]  = OS_ASCII_NUL;
0002a4  e5c4b00b          STRB     r11,[r4,#0xb]
;;;325    #endif
;;;326                     pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
0002a8  e5c4b000          STRB     r11,[r4,#0]
;;;327                     pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
0002ac  e59a0000          LDR      r0,[r10,#0]  ; OSFlagFreeList
0002b0  e5840004          STR      r0,[r4,#4]
;;;328                     pgrp->OSFlagFlags    = (OS_FLAGS)0;
0002b4  e1c4b0b8          STRH     r11,[r4,#8]
;;;329                     OSFlagFreeList       = pgrp;
;;;330                     OS_EXIT_CRITICAL();
0002b8  e1a00008          MOV      r0,r8
0002bc  e58a4000          STR      r4,[r10,#0]  ; OSFlagFreeList
0002c0  ebfffffe          BL       OS_CPU_SR_Restore
;;;331                     *perr                = OS_ERR_NONE;
;;;332                     pgrp_return          = (OS_FLAG_GRP *)0;  /* Event Flag Group has been deleted        */
0002c4  ea000017          B        |L1.808|
                  |L1.712|
;;;333                 } else {
;;;334                     OS_EXIT_CRITICAL();
0002c8  e1a00008          MOV      r0,r8
0002cc  ebfffffe          BL       OS_CPU_SR_Restore
;;;335                     *perr                = OS_ERR_TASK_WAITING;
0002d0  e3a00049          MOV      r0,#0x49
                  |L1.724|
;;;336                     pgrp_return          = pgrp;
;;;337                 }
;;;338                 break;
;;;339    
;;;340            case OS_DEL_ALWAYS:                                /* Always delete the event flag group       */
;;;341                 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;;;342                 while (pnode != (OS_FLAG_NODE *)0) {          /* Ready ALL tasks waiting for flags        */
;;;343                     (void)OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
;;;344                     pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
;;;345                 }
;;;346    #if OS_FLAG_NAME_SIZE > 1
;;;347                 pgrp->OSFlagName[0]  = '?';                   /* Unknown name                             */
;;;348                 pgrp->OSFlagName[1]  = OS_ASCII_NUL;
;;;349    #endif
;;;350                 pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
;;;351                 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
;;;352                 pgrp->OSFlagFlags    = (OS_FLAGS)0;
;;;353                 OSFlagFreeList       = pgrp;
;;;354                 OS_EXIT_CRITICAL();
;;;355                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
;;;356                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;357                 }
;;;358                 *perr = OS_ERR_NONE;
;;;359                 pgrp_return          = (OS_FLAG_GRP *)0;      /* Event Flag Group has been deleted        */
;;;360                 break;
;;;361    
;;;362            default:
;;;363                 OS_EXIT_CRITICAL();
;;;364                 *perr                = OS_ERR_INVALID_OPT;
0002d4  e5c60000          STRB     r0,[r6,#0]
;;;365                 pgrp_return          = pgrp;
0002d8  e1a00004          MOV      r0,r4
                  |L1.732|
0002dc  e8bd5ff0          POP      {r4-r12,lr}
;;;366                 break;
;;;367        }
;;;368        return (pgrp_return);
;;;369    }
0002e0  e12fff1e          BX       lr
                  |L1.740|
0002e4  e3a01000          MOV      r1,#0                 ;343
0002e8  e1a00005          MOV      r0,r5                 ;343
0002ec  ebfffffe          BL       OS_FlagTaskRdy
0002f0  e5955000          LDR      r5,[r5,#0]            ;344
                  |L1.756|
0002f4  e3550000          CMP      r5,#0                 ;342
0002f8  1afffff9          BNE      |L1.740|
0002fc  e5c4900a          STRB     r9,[r4,#0xa]          ;347
000300  e5c4b00b          STRB     r11,[r4,#0xb]         ;348
000304  e5c4b000          STRB     r11,[r4,#0]           ;350
000308  e59a0000          LDR      r0,[r10,#0]           ;351  ; OSFlagFreeList
00030c  e5840004          STR      r0,[r4,#4]            ;351
000310  e1c4b0b8          STRH     r11,[r4,#8]           ;352
000314  e1a00008          MOV      r0,r8                 ;354
000318  e58a4000          STR      r4,[r10,#0]           ;354  ; OSFlagFreeList
00031c  ebfffffe          BL       OS_CPU_SR_Restore
000320  e3570001          CMP      r7,#1                 ;355
000324  0bfffffe          BLEQ     OS_Sched
                  |L1.808|
000328  e3a00000          MOV      r0,#0                 ;359
00032c  e5c6b000          STRB     r11,[r6,#0]           ;358
000330  eaffffe9          B        |L1.732|
                  |L1.820|
000334  e1a00008          MOV      r0,r8                 ;363
000338  ebfffffe          BL       OS_CPU_SR_Restore
00033c  e3a00007          MOV      r0,#7                 ;364
000340  eaffffe3          B        |L1.724|
;;;370    #endif
                          ENDP

                  OSFlagNameGet PROC
;;;396    INT8U  OSFlagNameGet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
;;;397    {
000344  e92d41f0          PUSH     {r4-r8,lr}
000348  e1a06000          MOV      r6,r0
;;;398        INT8U      len;
;;;399    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;400        OS_CPU_SR  cpu_sr = 0;
;;;401    #endif
;;;402    

⌨️ 快捷键说明

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