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

📄 os_flag.txt

📁 一个电力系统谐波检测的程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:

                  OSFlagCreate PROC
;;;193    OS_FLAG_GRP  *OSFlagCreate (OS_FLAGS flags, INT8U *err)
;;;194    {
0001c8  e92d4070          PUSH     {r4-r6,lr}
0001cc  e1a04000          MOV      r4,r0
0001d0  e1a06001          MOV      r6,r1
;;;195    #if OS_CRITICAL_METHOD == 3                         /* Allocate storage for CPU status register        */
;;;196        OS_CPU_SR    cpu_sr;
;;;197    #endif
;;;198        OS_FLAG_GRP *pgrp;
;;;199    
;;;200    
;;;201        if (OSIntNesting > 0) {                         /* See if called from ISR ...                      */
0001d4  e59f097c          LDR      r0,|L1.2904|
0001d8  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0001dc  e3500000          CMP      r0,#0
0001e0  da000004          BLE      |L1.504|
;;;202            *err = OS_ERR_CREATE_ISR;                   /* ... can't CREATE from an ISR                    */
0001e4  e3a0008d          MOV      r0,#0x8d
0001e8  e5c60000          STRB     r0,[r6,#0]
;;;203            return ((OS_FLAG_GRP *)0);
0001ec  e3a00000          MOV      r0,#0
                  |L1.496|
0001f0  e8bd4070          POP      {r4-r6,lr}
;;;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    }
0001f4  e12fff1e          BX       lr
                  |L1.504|
0001f8  ef000002          SVC      0x2  ; formerly SWI   ;205
0001fc  e59f0958          LDR      r0,|L1.2908|          ;206
000200  e5905000          LDR      r5,[r0,#0]            ;206  ; OSFlagFreeList
000204  e3550000          CMP      r5,#0                 ;207
000208  0a00000c          BEQ      |L1.576|              ;207
00020c  e5900000          LDR      r0,[r0,#0]            ;209  ; OSFlagFreeList
000210  e5900004          LDR      r0,[r0,#4]            ;209
000214  e59f1940          LDR      r1,|L1.2908|          ;209
000218  e5810000          STR      r0,[r1,#0]            ;209  ; OSFlagFreeList
00021c  e3a00005          MOV      r0,#5                 ;210
000220  e5c50000          STRB     r0,[r5,#0]            ;210
000224  e1c540b8          STRH     r4,[r5,#8]            ;211
000228  e3a00000          MOV      r0,#0                 ;212
00022c  e5850004          STR      r0,[r5,#4]            ;212
000230  ef000003          SVC      0x3  ; formerly SWI   ;213
000234  e3a00000          MOV      r0,#0                 ;214
000238  e5c60000          STRB     r0,[r6,#0]            ;214
00023c  ea000002          B        |L1.588|              ;214
                  |L1.576|
000240  ef000003          SVC      0x3  ; formerly SWI   ;216
000244  e3a0009a          MOV      r0,#0x9a              ;217
000248  e5c60000          STRB     r0,[r6,#0]            ;217
                  |L1.588|
00024c  e1a00005          MOV      r0,r5                 ;219
000250  eaffffe6          B        |L1.496|              ;219
                          ENDP

                  OS_FlagUnlink PROC
;;;867    void  OS_FlagUnlink (OS_FLAG_NODE *pnode)
;;;868    {
000254  e52de004          PUSH     {lr}
;;;869    #if OS_TASK_DEL_EN > 0
;;;870        OS_TCB       *ptcb;
;;;871    #endif
;;;872        OS_FLAG_GRP  *pgrp;
;;;873        OS_FLAG_NODE *pnode_prev;
;;;874        OS_FLAG_NODE *pnode_next;
;;;875    
;;;876    
;;;877        pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
000258  e5903004          LDR      r3,[r0,#4]
;;;878        pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
00025c  e590c000          LDR      r12,[r0,#0]
;;;879        if (pnode_prev == (OS_FLAG_NODE *)0) {                      /* Is it first node in wait list?      */
000260  e3530000          CMP      r3,#0
000264  1a000006          BNE      |L1.644|
;;;880            pgrp                 = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
000268  e590200c          LDR      r2,[r0,#0xc]
;;;881            pgrp->OSFlagWaitList = (void *)pnode_next;              /*      Update list for new 1st node   */
00026c  e582c004          STR      r12,[r2,#4]
;;;882            if (pnode_next != (OS_FLAG_NODE *)0) {
000270  e35c0000          CMP      r12,#0
000274  0a000006          BEQ      |L1.660|
;;;883                pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0;     /*      Link new 1st node PREV to NULL */
000278  e3a0e000          MOV      lr,#0
00027c  e58ce004          STR      lr,[r12,#4]
000280  ea000003          B        |L1.660|
;;;884            }
;;;885        } else {                                                    /* No,  A node somewhere in the list   */
;;;886            pnode_prev->OSFlagNodeNext = pnode_next;                /*      Link around the node to unlink */
                  |L1.644|
000284  e583c000          STR      r12,[r3,#0]
;;;887            if (pnode_next != (OS_FLAG_NODE *)0) {                  /*      Was this the LAST node?        */
000288  e35c0000          CMP      r12,#0
00028c  0a000000          BEQ      |L1.660|
;;;888                pnode_next->OSFlagNodePrev = pnode_prev;            /*      No, Link around current node   */
000290  e58c3004          STR      r3,[r12,#4]
;;;889            }
;;;890        }
;;;891    #if OS_TASK_DEL_EN > 0
;;;892        ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;
                  |L1.660|
000294  e5901008          LDR      r1,[r0,#8]
;;;893        ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
000298  e3a0e000          MOV      lr,#0
00029c  e581e024          STR      lr,[r1,#0x24]
;;;894    #endif
;;;895    }
0002a0  e49de004          POP      {lr}
0002a4  e12fff1e          BX       lr
                          ENDP

                  OS_FlagTaskRdy PROC
;;;824    static  BOOLEAN  OS_FlagTaskRdy (OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy)
;;;825    {
0002a8  e92d40f0          PUSH     {r4-r7,lr}
0002ac  e1a04000          MOV      r4,r0
0002b0  e1a05001          MOV      r5,r1
;;;826        OS_TCB   *ptcb;
;;;827        BOOLEAN   sched;
;;;828    
;;;829    
;;;830        ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;  /* Point to TCB of waiting task             */
0002b4  e5946008          LDR      r6,[r4,#8]
;;;831        ptcb->OSTCBDly      = 0;
0002b8  e3a00000          MOV      r0,#0
0002bc  e1c602ba          STRH     r0,[r6,#0x2a]
;;;832        ptcb->OSTCBFlagsRdy = flags_rdy;
0002c0  e1c652b8          STRH     r5,[r6,#0x28]
;;;833        ptcb->OSTCBStat    &= ~OS_STAT_FLAG;
0002c4  e5d6002c          LDRB     r0,[r6,#0x2c]
0002c8  e3c00020          BIC      r0,r0,#0x20
0002cc  e5c6002c          STRB     r0,[r6,#0x2c]
;;;834        if (ptcb->OSTCBStat == OS_STAT_RDY) {                  /* Put task into ready list                 */
0002d0  e5d6002c          LDRB     r0,[r6,#0x2c]
0002d4  e3500000          CMP      r0,#0
0002d8  1a00000f          BNE      |L1.796|
;;;835            OSRdyGrp               |= ptcb->OSTCBBitY;
0002dc  e5d60031          LDRB     r0,[r6,#0x31]
0002e0  e59f1878          LDR      r1,|L1.2912|
0002e4  e5d11000          LDRB     r1,[r1,#0]  ; OSRdyGrp
0002e8  e1800001          ORR      r0,r0,r1
0002ec  e59f186c          LDR      r1,|L1.2912|
0002f0  e5c10000          STRB     r0,[r1,#0]  ; OSRdyGrp
;;;836            OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0002f4  e5d6002f          LDRB     r0,[r6,#0x2f]
0002f8  e59f1864          LDR      r1,|L1.2916|
0002fc  e7d10000          LDRB     r0,[r1,r0]
000300  e5d61030          LDRB     r1,[r6,#0x30]
000304  e1800001          ORR      r0,r0,r1
000308  e5d6102f          LDRB     r1,[r6,#0x2f]
00030c  e59f2850          LDR      r2,|L1.2916|
000310  e7c20001          STRB     r0,[r2,r1]
;;;837            sched                   = TRUE;
000314  e3a07001          MOV      r7,#1
000318  ea000000          B        |L1.800|
;;;838        } else {
;;;839            sched                   = FALSE;
                  |L1.796|
00031c  e3a07000          MOV      r7,#0
;;;840        }
;;;841        OS_FlagUnlink(pnode);
                  |L1.800|
000320  e1a00004          MOV      r0,r4
000324  ebfffffe          BL       OS_FlagUnlink
;;;842        return (sched);
000328  e1a00007          MOV      r0,r7
00032c  e8bd40f0          POP      {r4-r7,lr}
;;;843    }
000330  e12fff1e          BX       lr
                          ENDP

                  OSFlagDel PROC
;;;260    OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
;;;261    {
000334  e92d41f0          PUSH     {r4-r8,lr}
000338  e1a04000          MOV      r4,r0
00033c  e1a05001          MOV      r5,r1
000340  e1a06002          MOV      r6,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 ...               */
000344  e59f080c          LDR      r0,|L1.2904|
000348  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00034c  e3500000          CMP      r0,#0
000350  da000004          BLE      |L1.872|
;;;270            *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
000354  e3a0008c          MOV      r0,#0x8c
000358  e5c60000          STRB     r0,[r6,#0]
;;;271            return (pgrp);
00035c  e1a00004          MOV      r0,r4
                  |L1.864|
000360  e8bd41f0          POP      {r4-r8,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           */

⌨️ 快捷键说明

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