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

📄 os_core.txt

📁 uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的real view模板 uc/os在lpc210X系列的real view模板
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000350  e594000c          LDR      r0,[r4,#0xc]  ; OSCtxSwCtr
000354  e2800001          ADD      r0,r0,#1
000358  e584000c          STR      r0,[r4,#0xc]  ; OSCtxSwCtr
                  |L1.860|
;;;190                    OSIntCtxSw();                              /* Perform interrupt level ctx switch       */
;;;191                }
;;;192            }
;;;193            OS_EXIT_CRITICAL();
;;;194        }
;;;195    }
00035c  e8bd4010          POP      {r4,lr}
000360  e12fff1e          BX       lr
                  |L1.868|
000364  ef000003          SVC      #0x3                  ;193
000368  eafffffb          B        |L1.860|
;;;196    /*$PAGE*/
                          ENDP

                  OSSchedLock PROC
;;;214    void  OSSchedLock (void)
;;;215    {
00036c  e92d4010          PUSH     {r4,lr}
;;;216    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;217        OS_CPU_SR  cpu_sr;
;;;218    #endif    
;;;219        
;;;220        
;;;221        if (OSRunning == TRUE) {                     /* Make sure multitasking is running                  */
000370  e59f44e4          LDR      r4,|L1.2140|
000374  e5d40008          LDRB     r0,[r4,#8]  ; OSRunning
000378  e3500001          CMP      r0,#1
00037c  1a000006          BNE      |L1.924|
;;;222            OS_ENTER_CRITICAL();
000380  ef000002          SVC      #0x2
;;;223            if (OSLockNesting < 255) {               /* Prevent OSLockNesting from wrapping back to 0      */
000384  e5d40004          LDRB     r0,[r4,#4]  ; OSLockNesting
000388  e35000ff          CMP      r0,#0xff
00038c  2a000001          BCS      |L1.920|
;;;224                OSLockNesting++;                     /* Increment lock nesting level                       */
000390  e2800001          ADD      r0,r0,#1
000394  e5c40004          STRB     r0,[r4,#4]  ; OSLockNesting
                  |L1.920|
;;;225            }
;;;226            OS_EXIT_CRITICAL();
000398  ef000003          SVC      #0x3
                  |L1.924|
;;;227        }
;;;228    }
00039c  e8bd4010          POP      {r4,lr}
0003a0  e12fff1e          BX       lr
;;;229    #endif    
                          ENDP

                  OS_Sched PROC
;;;869    void  OS_Sched (void)
;;;870    {
0003a4  e92d4010          PUSH     {r4,lr}
;;;871    #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;872        OS_CPU_SR  cpu_sr;
;;;873    #endif    
;;;874        INT8U      y;
;;;875    
;;;876    
;;;877        OS_ENTER_CRITICAL();
0003a8  ef000002          SVC      #0x2
;;;878        if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked    */
0003ac  e59f14a8          LDR      r1,|L1.2140|
0003b0  e5d10002          LDRB     r0,[r1,#2]  ; OSIntNesting
0003b4  e5d12004          LDRB     r2,[r1,#4]  ; OSLockNesting
0003b8  e1900002          ORRS     r0,r0,r2
0003bc  1a000012          BNE      |L1.1036|
;;;879            y             = OSUnMapTbl[OSRdyGrp];          /* Get pointer to HPT ready to run              */
0003c0  e5d10007          LDRB     r0,[r1,#7]  ; OSRdyGrp
0003c4  e59f24b8          LDR      r2,|L1.2180|
0003c8  e7d20000          LDRB     r0,[r2,r0]
;;;880            OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
0003cc  e59f34b4          LDR      r3,|L1.2184|
0003d0  e7d33000          LDRB     r3,[r3,r0]
0003d4  e7d22003          LDRB     r2,[r2,r3]
0003d8  e0820180          ADD      r0,r2,r0,LSL #3
0003dc  e20000ff          AND      r0,r0,#0xff
0003e0  e5c10006          STRB     r0,[r1,#6]  ; OSPrioHighRdy
;;;881            if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task is highest rdy     */
0003e4  e5d12005          LDRB     r2,[r1,#5]  ; OSPrioCur
0003e8  e1500002          CMP      r0,r2
0003ec  0a000006          BEQ      |L1.1036|
;;;882                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
0003f0  e59f2484          LDR      r2,|L1.2172|
0003f4  e7920100          LDR      r0,[r2,r0,LSL #2]
0003f8  e5810028          STR      r0,[r1,#0x28]  ; OSTCBHighRdy
;;;883                OSCtxSwCtr++;                              /* Increment context switch counter             */
0003fc  e591000c          LDR      r0,[r1,#0xc]  ; OSCtxSwCtr
000400  e2800001          ADD      r0,r0,#1
000404  e581000c          STR      r0,[r1,#0xc]  ; OSCtxSwCtr
;;;884                OS_TASK_SW();                              /* Perform a context switch                     */
000408  ef000000          SVC      #0x0
                  |L1.1036|
;;;885            }
;;;886        }
;;;887        OS_EXIT_CRITICAL();
00040c  ef000003          SVC      #0x3
;;;888    }
000410  e8bd4010          POP      {r4,lr}
000414  e12fff1e          BX       lr
;;;889    /*$PAGE*/
                          ENDP

                  OSSchedUnlock PROC
;;;248    void  OSSchedUnlock (void)
;;;249    {
000418  e92d4010          PUSH     {r4,lr}
;;;250    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;251        OS_CPU_SR  cpu_sr;
;;;252    #endif    
;;;253        
;;;254        
;;;255        if (OSRunning == TRUE) {                                   /* Make sure multitasking is running    */
00041c  e59f4438          LDR      r4,|L1.2140|
000420  e5d40008          LDRB     r0,[r4,#8]  ; OSRunning
000424  e3500001          CMP      r0,#1
000428  1a00000d          BNE      |L1.1124|
;;;256            OS_ENTER_CRITICAL();
00042c  ef000002          SVC      #0x2
;;;257            if (OSLockNesting > 0) {                               /* Do not decrement if already 0        */
000430  e5d40004          LDRB     r0,[r4,#4]  ; OSLockNesting
000434  e3500000          CMP      r0,#0
000438  0a00000b          BEQ      |L1.1132|
;;;258                OSLockNesting--;                                   /* Decrement lock nesting level         */
00043c  e2400001          SUB      r0,r0,#1
000440  e20000ff          AND      r0,r0,#0xff
000444  e5c40004          STRB     r0,[r4,#4]  ; OSLockNesting
;;;259                if ((OSLockNesting == 0) && (OSIntNesting == 0)) { /* See if sched. enabled and not an ISR */
000448  e5d41002          LDRB     r1,[r4,#2]  ; OSIntNesting
00044c  e1900001          ORRS     r0,r0,r1
000450  1a000002          BNE      |L1.1120|
;;;260                    OS_EXIT_CRITICAL();
000454  ef000003          SVC      #0x3
;;;261                    OS_Sched();                                    /* See if a HPT is ready                */
000458  e8bd4010          POP      {r4,lr}
00045c  eafffffe          B        OS_Sched
                  |L1.1120|
;;;262                } else {
;;;263                    OS_EXIT_CRITICAL();
000460  ef000003          SVC      #0x3
                  |L1.1124|
;;;264                }
;;;265            } else {
;;;266                OS_EXIT_CRITICAL();
;;;267            }
;;;268        }
;;;269    }
000464  e8bd4010          POP      {r4,lr}
000468  e12fff1e          BX       lr
                  |L1.1132|
00046c  ef000003          SVC      #0x3                  ;266
000470  eafffffb          B        |L1.1124|
;;;270    #endif    
                          ENDP

                  OSStart PROC
;;;298    
;;;299        if (OSRunning == FALSE) {
000474  e59f03e0          LDR      r0,|L1.2140|
000478  e5d01008          LDRB     r1,[r0,#8]  ; OSRunning
00047c  e3510000          CMP      r1,#0
000480  1a00000e          BNE      |L1.1216|
;;;300            y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
000484  e5d01007          LDRB     r1,[r0,#7]  ; OSRdyGrp
000488  e59f23f4          LDR      r2,|L1.2180|
00048c  e7d21001          LDRB     r1,[r2,r1]
;;;301            x             = OSUnMapTbl[OSRdyTbl[y]];
000490  e59f33f0          LDR      r3,|L1.2184|
000494  e7d33001          LDRB     r3,[r3,r1]
000498  e7d22003          LDRB     r2,[r2,r3]
;;;302            OSPrioHighRdy = (INT8U)((y << 3) + x);
00049c  e0821181          ADD      r1,r2,r1,LSL #3
0004a0  e20110ff          AND      r1,r1,#0xff
0004a4  e5c01006          STRB     r1,[r0,#6]  ; OSPrioHighRdy
;;;303            OSPrioCur     = OSPrioHighRdy;
0004a8  e5c01005          STRB     r1,[r0,#5]  ; OSPrioCur
;;;304            OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
0004ac  e59f23c8          LDR      r2,|L1.2172|
0004b0  e7921101          LDR      r1,[r2,r1,LSL #2]
0004b4  e5801028          STR      r1,[r0,#0x28]  ; OSTCBHighRdy
;;;305            OSTCBCur      = OSTCBHighRdy;
0004b8  e5801020          STR      r1,[r0,#0x20]  ; OSTCBCur
;;;306            OSStartHighRdy();                            /* Execute target specific code to start task     */
0004bc  eafffffe          B        OSStartHighRdy
                  |L1.1216|
;;;307        }
;;;308    }
0004c0  e12fff1e          BX       lr
;;;309    /*$PAGE*/
                          ENDP

                  OSStatInit PROC
;;;331    void  OSStatInit (void)
;;;332    {
0004c4  e92d4010          PUSH     {r4,lr}
;;;333    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;334        OS_CPU_SR  cpu_sr;
;;;335    #endif    
;;;336        
;;;337        
;;;338        OSTimeDly(2);                                /* Synchronize with clock tick                        */
0004c8  e3a00002          MOV      r0,#2
0004cc  ebfffffe          BL       OSTimeDly
;;;339        OS_ENTER_CRITICAL();
0004d0  ef000002          SVC      #0x2
;;;340        OSIdleCtr    = 0L;                           /* Clear idle counter                                 */
0004d4  e59f4380          LDR      r4,|L1.2140|
0004d8  e3a00000          MOV      r0,#0
0004dc  e584001c          STR      r0,[r4,#0x1c]  ; OSIdleCtr
;;;341        OS_EXIT_CRITICAL();
0004e0  ef000003          SVC      #0x3
;;;342        OSTimeDly(OS_TICKS_PER_SEC);                 /* Determine MAX. idle counter value for 1 second     */
0004e4  e3a000c8          MOV      r0,#0xc8
0004e8  ebfffffe          BL       OSTimeDly
;;;343        OS_ENTER_CRITICAL();
0004ec  ef000002          SVC      #0x2
;;;344        OSIdleCtrMax = OSIdleCtr;                    /* Store maximum idle counter count in 1 second       */
0004f0  e594001c          LDR      r0,[r4,#0x1c]  ; OSIdleCtr
0004f4  e5840014          STR      r0,[r4,#0x14]  ; OSIdleCtrMax
;;;345        OSStatRdy    = TRUE;
0004f8  e3a00001          MOV      r0,#1
0004fc  e5c40001          STRB     r0,[r4,#1]  ; OSStatRdy
;;;346        OS_EXIT_CRITICAL();
000500  ef000003          SVC      #0x3
;;;347    }
000504  e8bd4010          POP      {r4,lr}
000508  e12fff1e          BX       lr
;;;348    #endif
                          ENDP

                  OSTimeTick PROC
;;;364    void  OSTimeTick (void)
;;;365    {
00050c  e92d4070          PUSH     {r4-r6,lr}
;;;366    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;367        OS_CPU_SR  cpu_sr;
;;;368    #endif    
;;;369        OS_TCB    *ptcb;
;;;370    
;;;371    
;;;372        OSTimeTickHook();                                      /* Call user definable hook                 */
000510  ebfffffe          BL       OSTimeTickHook
;;;373    #if OS_TIME_GET_SET_EN > 0   
;;;374        OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
000514  ef000002          SVC      #0x2
;;;375        OSTime++;
000518  e59f533c          LDR      r5,|L1.2140|
00051c  e5950030          LDR      r0,[r5,#0x30]  ; OSTime
000520  e2800001          ADD      r0,r0,#1
000524  e5850030          STR      r0,[r5,#0x30]  ; OSTime
;;;376        OS_EXIT_CRITICAL();
000528  ef000003          SVC      #0x3
;;;377    #endif
;;;378        if (OSRunning == TRUE) {    
00052c  e5d50008          LDRB     r0,[r5,#8]  ; OSRunning
000530  e3500001          CMP      r0,#1
000534  1a00001f          BNE      |L1.1464|
;;;379            ptcb = OSTCBList;                                  /* Point at first TCB in TCB list           */
000538  e595402c          LDR      r4,[r5,#0x2c]  ; OSTCBList
;;;380            while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {          /* Go through all TCBs in TCB list          */
00053c  ea00001a          B        |L1.1452|

⌨️ 快捷键说明

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