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

📄 os_core.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000398  ef000003          SVC      0x3  ; formerly SWI
;;;754    }
00039c  e8bd8010          POP      {r4,pc}
                          ENDP

                  OSSchedUnlock PROC
;;;369    void  OSSchedUnlock (void)
;;;370    {
0003a0  e92d4010          PUSH     {r4,lr}
;;;371    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;372        OS_CPU_SR  cpu_sr;
;;;373    #endif    
;;;374        
;;;375        
;;;376        if (OSRunning == TRUE) {                                   /* Make sure multitasking is running    */
0003a4  e59f0524          LDR      r0,|L1.2256|
0003a8  e5d00000          LDRB     r0,[r0,#0]  ; OSRunning
0003ac  e3500001          CMP      r0,#1
0003b0  1a000017          BNE      |L1.1044|
;;;377            OS_ENTER_CRITICAL();
0003b4  ef000002          SVC      0x2  ; formerly SWI
;;;378            if (OSLockNesting > 0) {                               /* Do not decrement if already 0        */
0003b8  e59f0508          LDR      r0,|L1.2248|
0003bc  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0003c0  e3500000          CMP      r0,#0
0003c4  da000011          BLE      |L1.1040|
;;;379                OSLockNesting--;                                   /* Decrement lock nesting level         */
0003c8  e59f04f8          LDR      r0,|L1.2248|
0003cc  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0003d0  e2400001          SUB      r0,r0,#1
0003d4  e59f14ec          LDR      r1,|L1.2248|
0003d8  e5c10000          STRB     r0,[r1,#0]  ; OSLockNesting
;;;380                if ((OSLockNesting == 0) && (OSIntNesting == 0)) { /* See if sched. enabled and not an ISR */
0003dc  e2810000          ADD      r0,r1,#0
0003e0  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0003e4  e3500000          CMP      r0,#0
0003e8  1a000006          BNE      |L1.1032|
0003ec  e59f04d0          LDR      r0,|L1.2244|
0003f0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0003f4  e3500000          CMP      r0,#0
0003f8  1a000002          BNE      |L1.1032|
;;;381                    OS_EXIT_CRITICAL();
0003fc  ef000003          SVC      0x3  ; formerly SWI
;;;382                    OS_Sched();                                    /* See if a HPT is ready                */
000400  ebfffffe          BL       OS_Sched
000404  ea000002          B        |L1.1044|
;;;383                } else {
;;;384                    OS_EXIT_CRITICAL();
                  |L1.1032|
000408  ef000003          SVC      0x3  ; formerly SWI
00040c  ea000000          B        |L1.1044|
;;;385                }
;;;386            } else {
;;;387                OS_EXIT_CRITICAL();
                  |L1.1040|
000410  ef000003          SVC      0x3  ; formerly SWI
;;;388            }
;;;389        }
;;;390    }
                  |L1.1044|
000414  e8bd8010          POP      {r4,pc}
                          ENDP

                  OSStart PROC
;;;412    void  OSStart (void)
;;;413    {
000418  e92d4070          PUSH     {r4-r6,lr}
;;;414        INT8U y;
;;;415        INT8U x;
;;;416    
;;;417    
;;;418        if (OSRunning == FALSE) {
00041c  e59f04ac          LDR      r0,|L1.2256|
000420  e5d00000          LDRB     r0,[r0,#0]  ; OSRunning
000424  e3500000          CMP      r0,#0
000428  1a000019          BNE      |L1.1172|
;;;419            y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
00042c  e59f04d8          LDR      r0,|L1.2316|
000430  e59f14a0          LDR      r1,|L1.2264|
000434  e5d11000          LDRB     r1,[r1,#0]  ; OSRdyGrp
000438  e7d04001          LDRB     r4,[r0,r1]
;;;420            x             = OSUnMapTbl[OSRdyTbl[y]];
00043c  e59f0498          LDR      r0,|L1.2268|
000440  e7d00004          LDRB     r0,[r0,r4]
000444  e59f14c0          LDR      r1,|L1.2316|
000448  e7d15000          LDRB     r5,[r1,r0]
;;;421            OSPrioHighRdy = (INT8U)((y << 3) + x);
00044c  e0850184          ADD      r0,r5,r4,LSL #3
000450  e59f148c          LDR      r1,|L1.2276|
000454  e5c10000          STRB     r0,[r1,#0]  ; OSPrioHighRdy
;;;422            OSPrioCur     = OSPrioHighRdy;
000458  e2810000          ADD      r0,r1,#0
00045c  e5d00000          LDRB     r0,[r0,#0]  ; OSPrioHighRdy
000460  e59f1478          LDR      r1,|L1.2272|
000464  e5c10000          STRB     r0,[r1,#0]  ; OSPrioCur
;;;423            OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
000468  e59f0484          LDR      r0,|L1.2292|
00046c  e59f1470          LDR      r1,|L1.2276|
000470  e5d11000          LDRB     r1,[r1,#0]  ; OSPrioHighRdy
000474  e7900101          LDR      r0,[r0,r1,LSL #2]
000478  e59f1468          LDR      r1,|L1.2280|
00047c  e5810000          STR      r0,[r1,#0]  ; OSTCBHighRdy
;;;424            OSTCBCur      = OSTCBHighRdy;
000480  e2810000          ADD      r0,r1,#0
000484  e5900000          LDR      r0,[r0,#0]  ; OSTCBHighRdy
000488  e59f145c          LDR      r1,|L1.2284|
00048c  e5810000          STR      r0,[r1,#0]  ; OSTCBCur
;;;425            OSStartHighRdy();                            /* Execute target specific code to start task     */
000490  ebfffffe          BL       OSStartHighRdy
;;;426        }
;;;427    }
                  |L1.1172|
000494  e8bd8070          POP      {r4-r6,pc}
                          ENDP

                  OSTimeTick PROC
;;;483    void  OSTimeTick (void)
;;;484    {
000498  e92d4010          PUSH     {r4,lr}
;;;485    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;486        OS_CPU_SR  cpu_sr;
;;;487    #endif    
;;;488        OS_TCB    *ptcb;
;;;489    
;;;490    
;;;491        OSTimeTickHook();                                      /* Call user definable hook                 */
00049c  ebfffffe          BL       OSTimeTickHook
;;;492    #if OS_TIME_GET_SET_EN > 0   
;;;493        OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
0004a0  ef000002          SVC      0x2  ; formerly SWI
;;;494        OSTime++;
0004a4  e59f0414          LDR      r0,|L1.2240|
0004a8  e5900000          LDR      r0,[r0,#0]  ; OSTime
0004ac  e2800001          ADD      r0,r0,#1
0004b0  e59f1408          LDR      r1,|L1.2240|
0004b4  e5810000          STR      r0,[r1,#0]  ; OSTime
;;;495        OS_EXIT_CRITICAL();
0004b8  ef000003          SVC      0x3  ; formerly SWI
;;;496    #endif    
;;;497        ptcb = OSTCBList;                                      /* Point at first TCB in TCB list           */
0004bc  e59f042c          LDR      r0,|L1.2288|
0004c0  e5904000          LDR      r4,[r0,#0]  ; OSTCBList
;;;498        while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              /* Go through all TCBs in TCB list          */
0004c4  ea00001f          B        |L1.1352|
;;;499            OS_ENTER_CRITICAL();
                  |L1.1224|
0004c8  ef000002          SVC      0x2  ; formerly SWI
;;;500            if (ptcb->OSTCBDly != 0) {                         /* Delayed or waiting for event with TO     */
0004cc  e1d401ba          LDRH     r0,[r4,#0x1a]
0004d0  e3500000          CMP      r0,#0
0004d4  0a000019          BEQ      |L1.1344|
;;;501                if (--ptcb->OSTCBDly == 0) {                   /* Decrement nbr of ticks to end of delay   */
0004d8  e1d401ba          LDRH     r0,[r4,#0x1a]
0004dc  e2400001          SUB      r0,r0,#1
0004e0  e1a00800          LSL      r0,r0,#16
0004e4  e1b00820          LSRS     r0,r0,#16
0004e8  e1c401ba          STRH     r0,[r4,#0x1a]
0004ec  1a000013          BNE      |L1.1344|
;;;502                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == 0x00) {   /* Is task suspended?             */
0004f0  e5d4001c          LDRB     r0,[r4,#0x1c]
0004f4  e3100008          TST      r0,#8
0004f8  1a00000e          BNE      |L1.1336|
;;;503                        OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task Rdy to Run (timed out)*/
0004fc  e5d40021          LDRB     r0,[r4,#0x21]
000500  e59f13d0          LDR      r1,|L1.2264|
000504  e5d11000          LDRB     r1,[r1,#0]  ; OSRdyGrp
000508  e1800001          ORR      r0,r0,r1
00050c  e59f13c4          LDR      r1,|L1.2264|
000510  e5c10000          STRB     r0,[r1,#0]  ; OSRdyGrp
;;;504                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000514  e5d4001f          LDRB     r0,[r4,#0x1f]
000518  e59f13bc          LDR      r1,|L1.2268|
00051c  e7d10000          LDRB     r0,[r1,r0]
000520  e5d41020          LDRB     r1,[r4,#0x20]
000524  e1800001          ORR      r0,r0,r1
000528  e5d4101f          LDRB     r1,[r4,#0x1f]
00052c  e59f23a8          LDR      r2,|L1.2268|
000530  e7c20001          STRB     r0,[r2,r1]
000534  ea000001          B        |L1.1344|
;;;505                    } else {                                       /* Yes, Leave 1 tick to prevent ...     */
;;;506                        ptcb->OSTCBDly = 1;                        /* ... loosing the task when the ...    */
                  |L1.1336|
000538  e3a00001          MOV      r0,#1
00053c  e1c401ba          STRH     r0,[r4,#0x1a]
;;;507                    }                                              /* ... suspension is removed.           */
;;;508                }
;;;509            }
;;;510            ptcb = ptcb->OSTCBNext;                                /* Point at next TCB in TCB list        */
                  |L1.1344|
000540  e5944004          LDR      r4,[r4,#4]
;;;511            OS_EXIT_CRITICAL();
000544  ef000003          SVC      0x3  ; formerly SWI
                  |L1.1352|
000548  e5d4001d          LDRB     r0,[r4,#0x1d]         ;498
00054c  e350000c          CMP      r0,#0xc               ;498
000550  1affffdc          BNE      |L1.1224|             ;498
;;;512        }
;;;513    }
000554  e8bd8010          POP      {r4,pc}
                          ENDP

                  OSVersion PROC
;;;530    {
;;;531        return (OS_VERSION);
000558  e3a000fb          MOV      r0,#0xfb
;;;532    }
00055c  e12fff1e          BX       lr
                          ENDP

                  OS_Dummy PROC
;;;549    {
;;;550    }
000560  e12fff1e          BX       lr
                          ENDP

                  OS_EventTaskRdy PROC
;;;576    INT8U  OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
;;;577    {
000564  e92d41f0          PUSH     {r4-r8,lr}
000568  e1a03000          MOV      r3,r0
;;;578        OS_TCB *ptcb;
;;;579        INT8U   x;
;;;580        INT8U   y;
;;;581        INT8U   bitx;
;;;582        INT8U   bity;
;;;583        INT8U   prio;
;;;584    
;;;585    
;;;586        y    = OSUnMapTbl[pevent->OSEventGrp];            /* Find highest prio. task waiting for message   */
00056c  e5d37001          LDRB     r7,[r3,#1]
000570  e59f8394          LDR      r8,|L1.2316|
000574  e7d84007          LDRB     r4,[r8,r7]
;;;587        bity = OSMapTbl[y];
000578  e59f7394          LDR      r7,|L1.2324|
00057c  e7d76004          LDRB     r6,[r7,r4]
;;;588        x    = OSUnMapTbl[pevent->OSEventTbl[y]];
000580  e2837008          ADD      r7,r3,#8
000584  e7d77004          LDRB     r7,[r7,r4]
000588  e7d8e007          LDRB     lr,[r8,r7]
;;;589        bitx = OSMapTbl[x];
00058c  e59f7380          LDR      r7,|L1.2324|
000590  e7d7500e          LDRB     r5,[r7,lr]
;;;590        prio = (INT8U)((y << 3) + x);                     /* Find priority of task getting the msg         */
000594  e08e7184          ADD      r7,lr,r4,LSL #3
000598  e20700ff          AND      r0,r7,#0xff
;;;591        if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) {   /* Remove this task from the waiting list        */
00059c  e2837008          ADD      r7,r3,#8
0005a0  e7d77004          LDRB     r7,[r7,r4]
0005a4  e1c77005          BIC      r7,r7,r5
0005a8  e21770ff          ANDS     r7,r7,#0xff
0005ac  e2838008          ADD      r8,r3,#8
0005b0  e7c87004          STRB     r7,[r8,r4]
0005b4  1a000002          BNE      |L1.1476|
;;;592            pevent->OSEventGrp &= ~bity;                  /* Clr group bit if this was only task pending   */
0005b8  e5d37001          LDRB     r7,[r3,#1]
0005bc  e1c77006          BIC      r7,r7,r6
0005c0  e5c37001          STRB     r7,[r3,#1]
;;;593        }
;;;594        ptcb                 =  OSTCBPrioTbl[prio];       /* Point to this task's OS_TCB                   */
                  |L1.1476|

⌨️ 快捷键说明

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