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

📄 os_core.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 5 页
字号:
0005c4  e59f7328          LDR      r7,|L1.2292|
0005c8  e797c100          LDR      r12,[r7,r0,LSL #2]
;;;595        ptcb->OSTCBDly       =  0;                        /* Prevent OSTimeTick() from readying task       */
0005cc  e3a07000          MOV      r7,#0
0005d0  e1cc71ba          STRH     r7,[r12,#0x1a]
;;;596        ptcb->OSTCBEventPtr  = (OS_EVENT *)0;             /* Unlink ECB from this task                     */
0005d4  e58c700c          STR      r7,[r12,#0xc]
;;;597    #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;;;598        ptcb->OSTCBMsg       = msg;                       /* Send message directly to waiting task         */
0005d8  e58c1010          STR      r1,[r12,#0x10]
;;;599    #else
;;;600        msg                  = msg;                       /* Prevent compiler warning if not used          */
;;;601    #endif
;;;602        ptcb->OSTCBStat     &= ~msk;                      /* Clear bit associated with event type          */
0005dc  e5dc701c          LDRB     r7,[r12,#0x1c]
0005e0  e1c77002          BIC      r7,r7,r2
0005e4  e5cc701c          STRB     r7,[r12,#0x1c]
;;;603        if (ptcb->OSTCBStat == OS_STAT_RDY) {             /* See if task is ready (could be susp'd)        */
0005e8  e5dc701c          LDRB     r7,[r12,#0x1c]
0005ec  e3570000          CMP      r7,#0
0005f0  1a000009          BNE      |L1.1564|
;;;604            OSRdyGrp        |=  bity;                     /* Put task in the ready to run list             */
0005f4  e59f72dc          LDR      r7,|L1.2264|
0005f8  e5d77000          LDRB     r7,[r7,#0]  ; OSRdyGrp
0005fc  e1877006          ORR      r7,r7,r6
000600  e59f82d0          LDR      r8,|L1.2264|
000604  e5c87000          STRB     r7,[r8,#0]  ; OSRdyGrp
;;;605            OSRdyTbl[y]     |=  bitx;
000608  e59f72cc          LDR      r7,|L1.2268|
00060c  e7d77004          LDRB     r7,[r7,r4]
000610  e1877005          ORR      r7,r7,r5
000614  e59f82c0          LDR      r8,|L1.2268|
000618  e7c87004          STRB     r7,[r8,r4]
;;;606        }
;;;607        return (prio);
;;;608    }
                  |L1.1564|
00061c  e8bd81f0          POP      {r4-r8,pc}
                          ENDP

                  OS_EventTaskWait PROC
;;;627    {
;;;628        OSTCBCur->OSTCBEventPtr = pevent;            /* Store pointer to event control block in TCB        */
000620  e59f12c4          LDR      r1,|L1.2284|
000624  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000628  e581000c          STR      r0,[r1,#0xc]
;;;629        if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {   /* Task no longer ready      */
00062c  e59f12b8          LDR      r1,|L1.2284|
000630  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000634  e5d1101f          LDRB     r1,[r1,#0x1f]
000638  e59f229c          LDR      r2,|L1.2268|
00063c  e7d21001          LDRB     r1,[r2,r1]
000640  e59f22a4          LDR      r2,|L1.2284|
000644  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
000648  e5d22020          LDRB     r2,[r2,#0x20]
00064c  e1c11002          BIC      r1,r1,r2
000650  e21110ff          ANDS     r1,r1,#0xff
000654  e59f2290          LDR      r2,|L1.2284|
000658  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
00065c  e5d2201f          LDRB     r2,[r2,#0x1f]
000660  e59f3274          LDR      r3,|L1.2268|
000664  e7c31002          STRB     r1,[r3,r2]
000668  1a000007          BNE      |L1.1676|
;;;630            OSRdyGrp &= ~OSTCBCur->OSTCBBitY;        /* Clear event grp bit if this was only task pending  */
00066c  e59f1278          LDR      r1,|L1.2284|
000670  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000674  e5d11021          LDRB     r1,[r1,#0x21]
000678  e59f2258          LDR      r2,|L1.2264|
00067c  e5d22000          LDRB     r2,[r2,#0]  ; OSRdyGrp
000680  e1c21001          BIC      r1,r2,r1
000684  e59f224c          LDR      r2,|L1.2264|
000688  e5c21000          STRB     r1,[r2,#0]  ; OSRdyGrp
;;;631        }
;;;632        pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;          /* Put task in waiting list  */
                  |L1.1676|
00068c  e59f1258          LDR      r1,|L1.2284|
000690  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000694  e5d1101f          LDRB     r1,[r1,#0x1f]
000698  e2802008          ADD      r2,r0,#8
00069c  e7d21001          LDRB     r1,[r2,r1]
0006a0  e59f2244          LDR      r2,|L1.2284|
0006a4  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
0006a8  e5d22020          LDRB     r2,[r2,#0x20]
0006ac  e1811002          ORR      r1,r1,r2
0006b0  e59f2234          LDR      r2,|L1.2284|
0006b4  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
0006b8  e5d2201f          LDRB     r2,[r2,#0x1f]
0006bc  e2803008          ADD      r3,r0,#8
0006c0  e7c31002          STRB     r1,[r3,r2]
;;;633        pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
0006c4  e5d01001          LDRB     r1,[r0,#1]
0006c8  e59f221c          LDR      r2,|L1.2284|
0006cc  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
0006d0  e5d22021          LDRB     r2,[r2,#0x21]
0006d4  e1811002          ORR      r1,r1,r2
0006d8  e5c01001          STRB     r1,[r0,#1]
;;;634    }
0006dc  e12fff1e          BX       lr
                          ENDP

                  OS_EventTO PROC
;;;653    {
;;;654        if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
0006e0  e59f1204          LDR      r1,|L1.2284|
0006e4  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
0006e8  e5d1101f          LDRB     r1,[r1,#0x1f]
0006ec  e2802008          ADD      r2,r0,#8
0006f0  e7d21001          LDRB     r1,[r2,r1]
0006f4  e59f21f0          LDR      r2,|L1.2284|
0006f8  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
0006fc  e5d22020          LDRB     r2,[r2,#0x20]
000700  e1c11002          BIC      r1,r1,r2
000704  e21110ff          ANDS     r1,r1,#0xff
000708  e59f21dc          LDR      r2,|L1.2284|
00070c  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
000710  e5d2201f          LDRB     r2,[r2,#0x1f]
000714  e2803008          ADD      r3,r0,#8
000718  e7c31002          STRB     r1,[r3,r2]
00071c  1a000005          BNE      |L1.1848|
;;;655            pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
000720  e5d01001          LDRB     r1,[r0,#1]
000724  e59f21c0          LDR      r2,|L1.2284|
000728  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
00072c  e5d22021          LDRB     r2,[r2,#0x21]
000730  e1c11002          BIC      r1,r1,r2
000734  e5c01001          STRB     r1,[r0,#1]
;;;656        }
;;;657        OSTCBCur->OSTCBStat     = OS_STAT_RDY;       /* Set status to ready                                */
                  |L1.1848|
000738  e3a01000          MOV      r1,#0
00073c  e59f21a8          LDR      r2,|L1.2284|
000740  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
000744  e5c2101c          STRB     r1,[r2,#0x1c]
;;;658        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;     /* No longer waiting for event                        */
000748  e59f219c          LDR      r2,|L1.2284|
00074c  e5922000          LDR      r2,[r2,#0]  ; OSTCBCur
000750  e582100c          STR      r1,[r2,#0xc]
;;;659    }
000754  e12fff1e          BX       lr
                          ENDP

                  OS_EventWaitListInit PROC
;;;680    
;;;681        pevent->OSEventGrp = 0x00;                   /* No task waiting on event                           */
000758  e3a02000          MOV      r2,#0
00075c  e5c02001          STRB     r2,[r0,#1]
;;;682        ptbl               = &pevent->OSEventTbl[0];
000760  e2801008          ADD      r1,r0,#8
;;;683    
;;;684    #if OS_EVENT_TBL_SIZE > 0
;;;685        *ptbl++            = 0x00;
000764  e4c12001          STRB     r2,[r1],#1
;;;686    #endif
;;;687    
;;;688    #if OS_EVENT_TBL_SIZE > 1
;;;689        *ptbl++            = 0x00;
000768  e4c12001          STRB     r2,[r1],#1
;;;690    #endif
;;;691    
;;;692    #if OS_EVENT_TBL_SIZE > 2
;;;693        *ptbl++            = 0x00;
;;;694    #endif
;;;695    
;;;696    #if OS_EVENT_TBL_SIZE > 3
;;;697        *ptbl++            = 0x00;
;;;698    #endif
;;;699    
;;;700    #if OS_EVENT_TBL_SIZE > 4
;;;701        *ptbl++            = 0x00;
;;;702    #endif
;;;703    
;;;704    #if OS_EVENT_TBL_SIZE > 5
;;;705        *ptbl++            = 0x00;
;;;706    #endif
;;;707    
;;;708    #if OS_EVENT_TBL_SIZE > 6
;;;709        *ptbl++            = 0x00;
;;;710    #endif
;;;711    
;;;712    #if OS_EVENT_TBL_SIZE > 7
;;;713        *ptbl              = 0x00;
;;;714    #endif
;;;715    }
00076c  e12fff1e          BX       lr
                          ENDP

                  OS_TCBInit PROC
;;;898    INT8U  OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
;;;899    {
000770  e92d5ff0          PUSH     {r4-r12,lr}
000774  e1a04000          MOV      r4,r0
000778  e1a05001          MOV      r5,r1
00077c  e1a06002          MOV      r6,r2
000780  e1a07003          MOV      r7,r3
000784  e28da028          ADD      r10,sp,#0x28
000788  e89a0700          LDM      r10,{r8-r10}
;;;900    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;901        OS_CPU_SR  cpu_sr;
;;;902    #endif    
;;;903        OS_TCB    *ptcb;
;;;904    
;;;905    
;;;906        OS_ENTER_CRITICAL();
00078c  ef000002          SVC      0x2  ; formerly SWI
;;;907        ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
000790  e59f0164          LDR      r0,|L1.2300|
000794  e590b000          LDR      r11,[r0,#0]  ; OSTCBFreeList
;;;908        if (ptcb != (OS_TCB *)0) {
000798  e35b0000          CMP      r11,#0
00079c  0a000043          BEQ      |L1.2224|
;;;909            OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
0007a0  e2801000          ADD      r1,r0,#0
0007a4  e59b0004          LDR      r0,[r11,#4]
0007a8  e5810000          STR      r0,[r1,#0]  ; OSTCBFreeList
;;;910            OS_EXIT_CRITICAL();
0007ac  ef000003          SVC      0x3  ; formerly SWI
;;;911            ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
0007b0  e58b5000          STR      r5,[r11,#0]
;;;912            ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
0007b4  e5cb401d          STRB     r4,[r11,#0x1d]
;;;913            ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
0007b8  e3a00000          MOV      r0,#0
0007bc  e5cb001c          STRB     r0,[r11,#0x1c]
;;;914            ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
0007c0  e1cb01ba          STRH     r0,[r11,#0x1a]
;;;915    
;;;916    #if OS_TASK_CREATE_EXT_EN > 0
;;;917            ptcb->OSTCBExtPtr    = pext;                       /* Store pointer to TCB extension           */
;;;918            ptcb->OSTCBStkSize   = stk_size;                   /* Store stack size                         */
;;;919            ptcb->OSTCBStkBottom = pbos;                       /* Store pointer to bottom of stack         */
;;;920            ptcb->OSTCBOpt       = opt;                        /* Store task options                       */
;;;921            ptcb->OSTCBId        = id;                         /* Store task ID                            */
;;;922    #else
;;;923            pext                 = pext;                       /* Prevent compiler warning if not used     */
0007c4  e1a00000          MOV      r0,r0
;;;924            stk_size             = stk_size;
0007c8  e1a00000          MOV      r0,r0
;;;925            pbos                 = pbos;
0007cc  e1a00000          MOV      r0,r0
;;;926            opt                  = opt;
0007d0  e1a00000          MOV      r0,r0
;;;927            id                   = id;
0007d4  e1a00000          MOV      r0,r0
;;;928    #endif
;;;929    
;;;930    #if OS_TASK_DEL_EN > 0
;;;931            ptcb->OSTCBDelReq    = OS_NO_ERR;
0007d8  e5cb0022          STRB     r0,[r11,#0x22]
;;;932    #endif
;;;933    
;;;934            ptcb->OSTCBY         = prio >> 3;                  /* Pre-compute X, Y, BitX and BitY          */
0007dc  e1a001c4          ASR      r0,r4,#3
0007e0  e5cb001f          STRB     r0,[r11,#0x1f]
;;;935            ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
0007e4  e5db001f          LDRB     r0,[r11,#0x1f]
0007e8  e59f1124          LDR      r1,|L1.2324|
0007ec  e7d10000          LDRB     r0,[r1,r0]
0007f0  e5cb0021          STRB     r0,[r11,#0x21]
;;;936            ptcb->OSTCBX         = prio & 0x07;
0007f4  e2040007          AND      r0,r4,#7

⌨️ 快捷键说明

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