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

📄 os_core.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
0007fc  e2800001          ADD      r0,r0,#1
000800  e59f1844          LDR      r1,|L1.4172|
000804  e5810000          STR      r0,[r1,#0]  ; OSCtxSwCtr
;;;356                        OSIntCtxSw();                          /* Perform interrupt level ctx switch       */
000808  ebfffffe          BL       OSIntCtxSw
                  |L1.2060|
;;;357                    }
;;;358                }
;;;359            }
;;;360            OS_EXIT_CRITICAL();
00080c  e1a00004          MOV      r0,r4
000810  ebfffffe          BL       OS_CPU_SR_Restore
                  |L1.2068|
;;;361        }
;;;362    }
000814  e8bd4010          POP      {r4,lr}
000818  e12fff1e          BX       lr
                          ENDP

                  OSSchedLock PROC
;;;381    void  OSSchedLock (void)
;;;382    {
00081c  e92d4010          PUSH     {r4,lr}
;;;383    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;384        OS_CPU_SR  cpu_sr = 0;
000820  e3a04000          MOV      r4,#0
;;;385    #endif
;;;386    
;;;387    
;;;388    
;;;389        if (OSRunning == OS_TRUE) {                  /* Make sure multitasking is running                  */
000824  e59f081c          LDR      r0,|L1.4168|
000828  e5d00000          LDRB     r0,[r0,#0]  ; OSRunning
00082c  e3500001          CMP      r0,#1
000830  1a000010          BNE      |L1.2168|
;;;390            OS_ENTER_CRITICAL();
000834  ebfffffe          BL       OS_CPU_SR_Save
000838  e1a04000          MOV      r4,r0
;;;391            if (OSIntNesting == 0) {                 /* Can't call from an ISR                             */
00083c  e59f07f8          LDR      r0,|L1.4156|
000840  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000844  e3500000          CMP      r0,#0
000848  1a000008          BNE      |L1.2160|
;;;392                if (OSLockNesting < 255u) {          /* Prevent OSLockNesting from wrapping back to 0      */
00084c  e59f07ec          LDR      r0,|L1.4160|
000850  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
000854  e35000ff          CMP      r0,#0xff
000858  2a000004          BCS      |L1.2160|
;;;393                    OSLockNesting++;                 /* Increment lock nesting level                       */
00085c  e59f07dc          LDR      r0,|L1.4160|
000860  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
000864  e2800001          ADD      r0,r0,#1
000868  e59f17d0          LDR      r1,|L1.4160|
00086c  e5c10000          STRB     r0,[r1,#0]  ; OSLockNesting
                  |L1.2160|
;;;394                }
;;;395            }
;;;396            OS_EXIT_CRITICAL();
000870  e1a00004          MOV      r0,r4
000874  ebfffffe          BL       OS_CPU_SR_Restore
                  |L1.2168|
;;;397        }
;;;398    }
000878  e8bd4010          POP      {r4,lr}
00087c  e12fff1e          BX       lr
                          ENDP

                  OS_Sched PROC
;;;1208   void  OS_Sched (void)
;;;1209   {
000880  e92d4010          PUSH     {r4,lr}
;;;1210   #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;1211       OS_CPU_SR  cpu_sr = 0;
000884  e3a04000          MOV      r4,#0
;;;1212   #endif
;;;1213   
;;;1214   
;;;1215   
;;;1216       OS_ENTER_CRITICAL();
000888  ebfffffe          BL       OS_CPU_SR_Save
00088c  e1a04000          MOV      r4,r0
;;;1217       if (OSIntNesting == 0) {                           /* Schedule only if all ISRs done and ...       */
000890  e59f07a4          LDR      r0,|L1.4156|
000894  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000898  e3500000          CMP      r0,#0
00089c  1a00001c          BNE      |L1.2324|
;;;1218           if (OSLockNesting == 0) {                      /* ... scheduler is not locked                  */
0008a0  e59f0798          LDR      r0,|L1.4160|
0008a4  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0008a8  e3500000          CMP      r0,#0
0008ac  1a000018          BNE      |L1.2324|
;;;1219               OS_SchedNew();
0008b0  ebfffffe          BL       OS_SchedNew
;;;1220               if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy     */
0008b4  e59f0770          LDR      r0,|L1.4140|
0008b8  e5d00000          LDRB     r0,[r0,#0]  ; OSPrioHighRdy
0008bc  e59f1764          LDR      r1,|L1.4136|
0008c0  e5d11000          LDRB     r1,[r1,#0]  ; OSPrioCur
0008c4  e1500001          CMP      r0,r1
0008c8  0a000011          BEQ      |L1.2324|
;;;1221                   OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
0008cc  e51f0344          LDR      r0,|L1.1424|
0008d0  e59f1754          LDR      r1,|L1.4140|
0008d4  e5d11000          LDRB     r1,[r1,#0]  ; OSPrioHighRdy
0008d8  e7900101          LDR      r0,[r0,r1,LSL #2]
0008dc  e59f174c          LDR      r1,|L1.4144|
0008e0  e5810000          STR      r0,[r1,#0]  ; OSTCBHighRdy
;;;1222   #if OS_TASK_PROFILE_EN > 0
;;;1223                   OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */
0008e4  e2810000          ADD      r0,r1,#0
0008e8  e5900000          LDR      r0,[r0,#0]  ; OSTCBHighRdy
0008ec  e5900034          LDR      r0,[r0,#0x34]
0008f0  e2800001          ADD      r0,r0,#1
0008f4  e5911000          LDR      r1,[r1,#0]  ; OSTCBHighRdy
0008f8  e5810034          STR      r0,[r1,#0x34]
;;;1224   #endif
;;;1225                   OSCtxSwCtr++;                          /* Increment context switch counter             */
0008fc  e59f0748          LDR      r0,|L1.4172|
000900  e5900000          LDR      r0,[r0,#0]  ; OSCtxSwCtr
000904  e2800001          ADD      r0,r0,#1
000908  e59f173c          LDR      r1,|L1.4172|
00090c  e5810000          STR      r0,[r1,#0]  ; OSCtxSwCtr
;;;1226                   OS_TASK_SW();                          /* Perform a context switch                     */
000910  ebfffffe          BL       OSCtxSw
                  |L1.2324|
;;;1227               }
;;;1228           }
;;;1229       }
;;;1230       OS_EXIT_CRITICAL();
000914  e1a00004          MOV      r0,r4
000918  ebfffffe          BL       OS_CPU_SR_Restore
;;;1231   }
00091c  e8bd4010          POP      {r4,lr}
000920  e12fff1e          BX       lr
                          ENDP

                  OSSchedUnlock PROC
;;;418    void  OSSchedUnlock (void)
;;;419    {
000924  e92d4010          PUSH     {r4,lr}
;;;420    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;421        OS_CPU_SR  cpu_sr = 0;
000928  e3a04000          MOV      r4,#0
;;;422    #endif
;;;423    
;;;424    
;;;425    
;;;426        if (OSRunning == OS_TRUE) {                            /* Make sure multitasking is running        */
00092c  e59f0714          LDR      r0,|L1.4168|
000930  e5d00000          LDRB     r0,[r0,#0]  ; OSRunning
000934  e3500001          CMP      r0,#1
000938  1a00001e          BNE      |L1.2488|
;;;427            OS_ENTER_CRITICAL();
00093c  ebfffffe          BL       OS_CPU_SR_Save
000940  e1a04000          MOV      r4,r0
;;;428            if (OSLockNesting > 0) {                           /* Do not decrement if already 0            */
000944  e59f06f4          LDR      r0,|L1.4160|
000948  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
00094c  e3500000          CMP      r0,#0
000950  da000016          BLE      |L1.2480|
;;;429                OSLockNesting--;                               /* Decrement lock nesting level             */
000954  e59f06e4          LDR      r0,|L1.4160|
000958  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
00095c  e2400001          SUB      r0,r0,#1
000960  e59f16d8          LDR      r1,|L1.4160|
000964  e5c10000          STRB     r0,[r1,#0]  ; OSLockNesting
;;;430                if (OSLockNesting == 0) {                      /* See if scheduler is enabled and ...      */
000968  e2810000          ADD      r0,r1,#0
00096c  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
000970  e3500000          CMP      r0,#0
000974  1a00000a          BNE      |L1.2468|
;;;431                    if (OSIntNesting == 0) {                   /* ... not in an ISR                        */
000978  e59f06bc          LDR      r0,|L1.4156|
00097c  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000980  e3500000          CMP      r0,#0
000984  1a000003          BNE      |L1.2456|
;;;432                        OS_EXIT_CRITICAL();
000988  e1a00004          MOV      r0,r4
00098c  ebfffffe          BL       OS_CPU_SR_Restore
;;;433                        OS_Sched();                            /* See if a HPT is ready                    */
000990  ebfffffe          BL       OS_Sched
000994  ea000007          B        |L1.2488|
                  |L1.2456|
;;;434                    } else {
;;;435                        OS_EXIT_CRITICAL();
000998  e1a00004          MOV      r0,r4
00099c  ebfffffe          BL       OS_CPU_SR_Restore
0009a0  ea000004          B        |L1.2488|
                  |L1.2468|
;;;436                    }
;;;437                } else {
;;;438                    OS_EXIT_CRITICAL();
0009a4  e1a00004          MOV      r0,r4
0009a8  ebfffffe          BL       OS_CPU_SR_Restore
0009ac  ea000001          B        |L1.2488|
                  |L1.2480|
;;;439                }
;;;440            } else {
;;;441                OS_EXIT_CRITICAL();
0009b0  e1a00004          MOV      r0,r4
0009b4  ebfffffe          BL       OS_CPU_SR_Restore
                  |L1.2488|
;;;442            }
;;;443        }
;;;444    }
0009b8  e8bd4010          POP      {r4,lr}
0009bc  e12fff1e          BX       lr
                          ENDP

                  OSStart PROC
;;;468    void  OSStart (void)
;;;469    {
0009c0  e92d4010          PUSH     {r4,lr}
;;;470        if (OSRunning == OS_FALSE) {
0009c4  e59f067c          LDR      r0,|L1.4168|
0009c8  e5d00000          LDRB     r0,[r0,#0]  ; OSRunning
0009cc  e3500000          CMP      r0,#0
0009d0  1a00000f          BNE      |L1.2580|
;;;471            OS_SchedNew();                               /* Find highest priority's task priority number   */
0009d4  ebfffffe          BL       OS_SchedNew
;;;472            OSPrioCur     = OSPrioHighRdy;
0009d8  e59f064c          LDR      r0,|L1.4140|
0009dc  e5d00000          LDRB     r0,[r0,#0]  ; OSPrioHighRdy
0009e0  e59f1640          LDR      r1,|L1.4136|
0009e4  e5c10000          STRB     r0,[r1,#0]  ; OSPrioCur
;;;473            OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
0009e8  e51f0460          LDR      r0,|L1.1424|
0009ec  e59f1638          LDR      r1,|L1.4140|
0009f0  e5d11000          LDRB     r1,[r1,#0]  ; OSPrioHighRdy
0009f4  e7900101          LDR      r0,[r0,r1,LSL #2]
0009f8  e59f1630          LDR      r1,|L1.4144|
0009fc  e5810000          STR      r0,[r1,#0]  ; OSTCBHighRdy
;;;474            OSTCBCur      = OSTCBHighRdy;
000a00  e2810000          ADD      r0,r1,#0
000a04  e5900000          LDR      r0,[r0,#0]  ; OSTCBHighRdy
000a08  e59f1624          LDR      r1,|L1.4148|
000a0c  e5810000          STR      r0,[r1,#0]  ; OSTCBCur
;;;475            OSStartHighRdy();                            /* Execute target specific code to start task     */
000a10  ebfffffe          BL       OSStartHighRdy
                  |L1.2580|
;;;476        }
;;;477    }
000a14  e8bd4010          POP      {r4,lr}
000a18  e12fff1e          BX       lr
                          ENDP

                  OSStatInit PROC
;;;500    void  OSStatInit (void)
;;;501    {
000a1c  e92d4010          PUSH     {r4,lr}
;;;502    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;503        OS_CPU_SR  cpu_sr = 0;
000a20  e3a04000          MOV      r4,#0
;;;504    #endif
;;;505    
;;;506    
;;;507    
;;;508        OSTimeDly(2);                                /* Synchronize with clock tick                        */
000a24  e3a00002          MOV      r0,#2
000a28  ebfffffe          BL       OSTimeDly
;;;509        OS_ENTER_CRITICAL();
000a2c  ebfffffe          BL       OS_CPU_SR_Save
000a30  e1a04000          MOV      r4,r0
;;;510        OSIdleCtr    = 0L;                           /* Clear idle counter                                 */
000a34  e3a00000          MOV      r0,#0
000a38  e51f14a4          LDR      r1,|L1.1436|
000a3c  e5810000          STR      r0,[r1,#0]  ; OSIdleCtr
;;;511        OS_EXIT_CRITICAL();
000a40  e1a00004          MOV      r0,r4
000a44  ebfffffe          BL       OS_CPU_SR_Restore
;;;512        OSTimeDly(OS_TICKS_PER_SEC / 10);            /* Determine MAX. idle counter value for 1/10 second  */
000a48  e3a00064          MOV      r0,#0x64
000a4c  ebfffffe          BL       OSTimeDly
;;;513        OS_ENTER_CRITICAL();
000a50  ebfffffe          BL       OS_CPU_SR_Save
000a54  e1a04000          MOV      r4,r0
;;;514        OSIdleCtrMax = OSIdleCtr;                    /* Store maximum idle counter count in 1/10 second    */
000a58  e51f04c4          LDR      r0,|L1.1436|
000a5c  e5900000          LDR      r0,[r0,#0]  ; OSIdleCtr
000a60  e51f14d0          LDR      r1,|L1.1432|
000a64  e5810000          STR      r0

⌨️ 快捷键说明

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