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

📄 os_core.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;192        #endif
;;;193    #endif
;;;194    
;;;195        /* ------------------------------- CREATION OF 'STATISTIC' TASK ---------------------------------- */
;;;196    #if OS_TASK_STAT_EN > 0
;;;197        #if OS_TASK_CREATE_EXT_EN > 0
;;;198            #if OS_STK_GROWTH == 1
;;;199            (void)OSTaskCreateExt(OS_TaskStat,
;;;200                                  (void *)0,                                   /* No args passed to OS_TaskStat()*/
;;;201                                  &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   /* Set Top-Of-Stack               */
;;;202                                  OS_STAT_PRIO,                                /* One higher than the idle task  */
;;;203                                  OS_TASK_STAT_ID,
;;;204                                  &OSTaskStatStk[0],                           /* Set Bottom-Of-Stack            */
;;;205                                  OS_TASK_STAT_STK_SIZE,
;;;206                                  (void *)0,                                   /* No TCB extension               */
;;;207                                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
;;;208            #else
;;;209            (void)OSTaskCreateExt(OS_TaskStat,
;;;210                                  (void *)0,                                   /* No args passed to OS_TaskStat()*/
;;;211                                  &OSTaskStatStk[0],                           /* Set Top-Of-Stack               */
;;;212                                  OS_STAT_PRIO,                                /* One higher than the idle task  */
;;;213                                  OS_TASK_STAT_ID,
;;;214                                  &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   /* Set Bottom-Of-Stack            */
;;;215                                  OS_TASK_STAT_STK_SIZE,
;;;216                                  (void *)0,                                   /* No TCB extension               */
;;;217                                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
;;;218            #endif
;;;219        #else
;;;220            #if OS_STK_GROWTH == 1
;;;221            (void)OSTaskCreate(OS_TaskStat,
;;;222                               (void *)0,                                      /* No args passed to OS_TaskStat()*/
;;;223                               &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],      /* Set Top-Of-Stack               */
;;;224                               OS_STAT_PRIO);                                  /* One higher than the idle task  */
;;;225            #else
;;;226            (void)OSTaskCreate(OS_TaskStat,
;;;227                               (void *)0,                                      /* No args passed to OS_TaskStat()*/
;;;228                               &OSTaskStatStk[0],                              /* Set Top-Of-Stack               */
;;;229                               OS_STAT_PRIO);                                  /* One higher than the idle task  */
;;;230            #endif
;;;231        #endif
;;;232    #endif
;;;233    
;;;234    #if OS_VERSION >= 204
;;;235        OSInitHookEnd();                                                       /* Call port specific init. code  */
0001a0  ebfffffe          BL       OSInitHookEnd
;;;236    #endif
;;;237    }
0001a4  e8bd87f0          POP      {r4-r10,pc}
                          ENDP

                  OSIntEnter PROC
;;;262    void  OSIntEnter (void)
;;;263    {
0001a8  e92d4010          PUSH     {r4,lr}
;;;264    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;265        OS_CPU_SR  cpu_sr;
;;;266    #endif    
;;;267        
;;;268        
;;;269        OS_ENTER_CRITICAL();
0001ac  ef000002          SVC      0x2  ; formerly SWI
;;;270        if (OSIntNesting < 255) {
0001b0  e59f070c          LDR      r0,|L1.2244|
0001b4  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0001b8  e35000ff          CMP      r0,#0xff
0001bc  aa000004          BGE      |L1.468|
;;;271            OSIntNesting++;                          /* Increment ISR nesting level                        */
0001c0  e59f06fc          LDR      r0,|L1.2244|
0001c4  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0001c8  e2800001          ADD      r0,r0,#1
0001cc  e59f16f0          LDR      r1,|L1.2244|
0001d0  e5c10000          STRB     r0,[r1,#0]  ; OSIntNesting
;;;272        }
;;;273        OS_EXIT_CRITICAL();
                  |L1.468|
0001d4  ef000003          SVC      0x3  ; formerly SWI
;;;274    }
0001d8  e8bd8010          POP      {r4,pc}
                          ENDP

                  OSIntExit PROC
;;;295    void  OSIntExit (void)
;;;296    {
0001dc  e92d4010          PUSH     {r4,lr}
;;;297    #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;298        OS_CPU_SR  cpu_sr;
;;;299    #endif
;;;300        
;;;301        
;;;302        OS_ENTER_CRITICAL();
0001e0  ef000002          SVC      0x2  ; formerly SWI
;;;303        if (OSIntNesting > 0) {                            /* Prevent OSIntNesting from wrapping           */
0001e4  e59f06d8          LDR      r0,|L1.2244|
0001e8  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0001ec  e3500000          CMP      r0,#0
0001f0  da000004          BLE      |L1.520|
;;;304            OSIntNesting--;
0001f4  e59f06c8          LDR      r0,|L1.2244|
0001f8  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0001fc  e2400001          SUB      r0,r0,#1
000200  e59f16bc          LDR      r1,|L1.2244|
000204  e5c10000          STRB     r0,[r1,#0]  ; OSIntNesting
;;;305        }
;;;306        if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs complete ...     */
                  |L1.520|
000208  e59f06b4          LDR      r0,|L1.2244|
00020c  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000210  e3500000          CMP      r0,#0
000214  1a000025          BNE      |L1.688|
000218  e59f06a8          LDR      r0,|L1.2248|
00021c  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
000220  e3500000          CMP      r0,#0
000224  1a000021          BNE      |L1.688|
;;;307            OSIntExitY    = OSUnMapTbl[OSRdyGrp];          /* ... and not locked.                          */
000228  e59f06dc          LDR      r0,|L1.2316|
00022c  e59f16a4          LDR      r1,|L1.2264|
000230  e5d11000          LDRB     r1,[r1,#0]  ; OSRdyGrp
000234  e7d00001          LDRB     r0,[r0,r1]
000238  e59f16d0          LDR      r1,|L1.2320|
00023c  e5c10000          STRB     r0,[r1,#0]  ; OSIntExitY
;;;308            OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
000240  e59f0694          LDR      r0,|L1.2268|
000244  e5d11000          LDRB     r1,[r1,#0]  ; OSIntExitY
000248  e7d00001          LDRB     r0,[r0,r1]
00024c  e59f16b8          LDR      r1,|L1.2316|
000250  e7d10000          LDRB     r0,[r1,r0]
000254  e59f16b4          LDR      r1,|L1.2320|
000258  e5d11000          LDRB     r1,[r1,#0]  ; OSIntExitY
00025c  e0800181          ADD      r0,r0,r1,LSL #3
000260  e59f167c          LDR      r1,|L1.2276|
000264  e5c10000          STRB     r0,[r1,#0]  ; OSPrioHighRdy
;;;309            if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task is highest rdy     */
000268  e2810000          ADD      r0,r1,#0
00026c  e5d00000          LDRB     r0,[r0,#0]  ; OSPrioHighRdy
000270  e59f1668          LDR      r1,|L1.2272|
000274  e5d11000          LDRB     r1,[r1,#0]  ; OSPrioCur
000278  e1500001          CMP      r0,r1
00027c  0a00000b          BEQ      |L1.688|
;;;310                OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
000280  e59f066c          LDR      r0,|L1.2292|
000284  e59f1658          LDR      r1,|L1.2276|
000288  e5d11000          LDRB     r1,[r1,#0]  ; OSPrioHighRdy
00028c  e7900101          LDR      r0,[r0,r1,LSL #2]
000290  e59f1650          LDR      r1,|L1.2280|
000294  e5810000          STR      r0,[r1,#0]  ; OSTCBHighRdy
;;;311                OSCtxSwCtr++;                              /* Keep track of the number of context switches */
000298  e59f0634          LDR      r0,|L1.2260|
00029c  e5900000          LDR      r0,[r0,#0]  ; OSCtxSwCtr
0002a0  e2800001          ADD      r0,r0,#1
0002a4  e59f1628          LDR      r1,|L1.2260|
0002a8  e5810000          STR      r0,[r1,#0]  ; OSCtxSwCtr
;;;312                OSIntCtxSw();                              /* Perform interrupt level context switch       */
;;;313            }
;;;314        }
;;;315        OS_EXIT_CRITICAL();
;;;316    }
                  |L1.684|
0002ac  e8bd8010          POP      {r4,pc}
                  |L1.688|
0002b0  ef000003          SVC      0x3  ; formerly SWI   ;315
0002b4  eafffffc          B        |L1.684|
                          ENDP

                  OSSchedLock PROC
;;;335    void  OSSchedLock (void)
;;;336    {
0002b8  e92d4010          PUSH     {r4,lr}
;;;337    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;338        OS_CPU_SR  cpu_sr;
;;;339    #endif    
;;;340        
;;;341        
;;;342        if (OSRunning == TRUE) {                     /* Make sure multitasking is running                  */
0002bc  e59f060c          LDR      r0,|L1.2256|
0002c0  e5d00000          LDRB     r0,[r0,#0]  ; OSRunning
0002c4  e3500001          CMP      r0,#1
0002c8  1a00000a          BNE      |L1.760|
;;;343            OS_ENTER_CRITICAL();
0002cc  ef000002          SVC      0x2  ; formerly SWI
;;;344            if (OSLockNesting < 255) {               /* Prevent OSLockNesting from wrapping back to 0      */
0002d0  e59f05f0          LDR      r0,|L1.2248|
0002d4  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0002d8  e35000ff          CMP      r0,#0xff
0002dc  aa000004          BGE      |L1.756|
;;;345                OSLockNesting++;                     /* Increment lock nesting level                       */
0002e0  e59f05e0          LDR      r0,|L1.2248|
0002e4  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0002e8  e2800001          ADD      r0,r0,#1
0002ec  e59f15d4          LDR      r1,|L1.2248|
0002f0  e5c10000          STRB     r0,[r1,#0]  ; OSLockNesting
;;;346            }
;;;347            OS_EXIT_CRITICAL();
                  |L1.756|
0002f4  ef000003          SVC      0x3  ; formerly SWI
;;;348        }
;;;349    }
                  |L1.760|
0002f8  e8bd8010          POP      {r4,pc}
                          ENDP

                  OS_Sched PROC
;;;735    void  OS_Sched (void)
;;;736    {
0002fc  e92d4010          PUSH     {r4,lr}
;;;737    #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;738        OS_CPU_SR  cpu_sr;
;;;739    #endif    
;;;740        INT8U      y;
;;;741    
;;;742    
;;;743        OS_ENTER_CRITICAL();
000300  ef000002          SVC      0x2  ; formerly SWI
;;;744        if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked    */
000304  e59f05b8          LDR      r0,|L1.2244|
000308  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
00030c  e3500000          CMP      r0,#0
000310  1a000020          BNE      |L1.920|
000314  e59f05ac          LDR      r0,|L1.2248|
000318  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
00031c  e3500000          CMP      r0,#0
000320  1a00001c          BNE      |L1.920|
;;;745            y             = OSUnMapTbl[OSRdyGrp];          /* Get pointer to HPT ready to run              */
000324  e59f05e0          LDR      r0,|L1.2316|
000328  e59f15a8          LDR      r1,|L1.2264|
00032c  e5d11000          LDRB     r1,[r1,#0]  ; OSRdyGrp
000330  e7d04001          LDRB     r4,[r0,r1]
;;;746            OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
000334  e59f05a0          LDR      r0,|L1.2268|
000338  e7d00004          LDRB     r0,[r0,r4]
00033c  e59f15c8          LDR      r1,|L1.2316|
000340  e7d10000          LDRB     r0,[r1,r0]
000344  e0800184          ADD      r0,r0,r4,LSL #3
000348  e59f1594          LDR      r1,|L1.2276|
00034c  e5c10000          STRB     r0,[r1,#0]  ; OSPrioHighRdy
;;;747            if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task is highest rdy     */
000350  e2810000          ADD      r0,r1,#0
000354  e5d00000          LDRB     r0,[r0,#0]  ; OSPrioHighRdy
000358  e59f1580          LDR      r1,|L1.2272|
00035c  e5d11000          LDRB     r1,[r1,#0]  ; OSPrioCur
000360  e1500001          CMP      r0,r1
000364  0a00000b          BEQ      |L1.920|
;;;748                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
000368  e59f0584          LDR      r0,|L1.2292|
00036c  e59f1570          LDR      r1,|L1.2276|
000370  e5d11000          LDRB     r1,[r1,#0]  ; OSPrioHighRdy
000374  e7900101          LDR      r0,[r0,r1,LSL #2]
000378  e59f1568          LDR      r1,|L1.2280|
00037c  e5810000          STR      r0,[r1,#0]  ; OSTCBHighRdy
;;;749                OSCtxSwCtr++;                              /* Increment context switch counter             */
000380  e59f054c          LDR      r0,|L1.2260|
000384  e5900000          LDR      r0,[r0,#0]  ; OSCtxSwCtr
000388  e2800001          ADD      r0,r0,#1
00038c  e59f1540          LDR      r1,|L1.2260|
000390  e5810000          STR      r0,[r1,#0]  ; OSCtxSwCtr
;;;750                OS_TASK_SW();                              /* Perform a context switch                     */
000394  ef000000          SVC      0x0  ; formerly SWI
;;;751            }
;;;752        }
;;;753        OS_EXIT_CRITICAL();
                  |L1.920|

⌨️ 快捷键说明

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