📄 os_core.txt
字号:
;;;179 if (OSRunning == TRUE) {
000384 e59f07d0 LDR r0,|L1.2908|
000388 e5d00000 LDRB r0,[r0,#0] ; OSRunning
00038c e3500001 CMP r0,#1
000390 1a000035 BNE |L1.1132|
;;;180 OS_ENTER_CRITICAL();
000394 ef000002 SVC 0x2 ; formerly SWI
;;;181 if (OSIntNesting > 0) { /* Prevent OSIntNesting from wrapping */
000398 e59f07b0 LDR r0,|L1.2896|
00039c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0003a0 e3500000 CMP r0,#0
0003a4 da000004 BLE |L1.956|
;;;182 OSIntNesting--;
0003a8 e59f07a0 LDR r0,|L1.2896|
0003ac e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0003b0 e2400001 SUB r0,r0,#1
0003b4 e59f1794 LDR r1,|L1.2896|
0003b8 e5c10000 STRB r0,[r1,#0] ; OSIntNesting
;;;183 }
;;;184 if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs complete ... */
|L1.956|
0003bc e59f078c LDR r0,|L1.2896|
0003c0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0003c4 e3500000 CMP r0,#0
0003c8 1a000026 BNE |L1.1128|
0003cc e59f0780 LDR r0,|L1.2900|
0003d0 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0003d4 e3500000 CMP r0,#0
0003d8 1a000022 BNE |L1.1128|
;;;185 OSIntExitY = OSUnMapTbl[OSRdyGrp]; /* ... and not locked. */
0003dc e59f0780 LDR r0,|L1.2916|
0003e0 e59f174c LDR r1,|L1.2868|
0003e4 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
0003e8 e7d00001 LDRB r0,[r0,r1]
0003ec e59f1774 LDR r1,|L1.2920|
0003f0 e5c10000 STRB r0,[r1,#0] ; OSIntExitY
;;;186 OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
0003f4 e59f073c LDR r0,|L1.2872|
0003f8 e5d11000 LDRB r1,[r1,#0] ; OSIntExitY
0003fc e7d00001 LDRB r0,[r0,r1]
000400 e59f175c LDR r1,|L1.2916|
000404 e7d10000 LDRB r0,[r1,r0]
000408 e59f1758 LDR r1,|L1.2920|
00040c e5d11000 LDRB r1,[r1,#0] ; OSIntExitY
000410 e0800181 ADD r0,r0,r1,LSL #3
000414 e59f1724 LDR r1,|L1.2880|
000418 e5c10000 STRB r0,[r1,#0] ; OSPrioHighRdy
;;;187 if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
00041c e2810000 ADD r0,r1,#0
000420 e5d00000 LDRB r0,[r0,#0] ; OSPrioHighRdy
000424 e59f1710 LDR r1,|L1.2876|
000428 e5d11000 LDRB r1,[r1,#0] ; OSPrioCur
00042c e1500001 CMP r0,r1
000430 0a00000c BEQ |L1.1128|
;;;188 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
000434 e59f06ec LDR r0,|L1.2856|
000438 e59f1700 LDR r1,|L1.2880|
00043c e5d11000 LDRB r1,[r1,#0] ; OSPrioHighRdy
000440 e7900101 LDR r0,[r0,r1,LSL #2]
000444 e59f16f8 LDR r1,|L1.2884|
000448 e5810000 STR r0,[r1,#0] ; OSTCBHighRdy
;;;189 OSCtxSwCtr++; /* Keep track of the number of ctx switches */
00044c e59f070c LDR r0,|L1.2912|
000450 e5900000 LDR r0,[r0,#0] ; OSCtxSwCtr
000454 e2800001 ADD r0,r0,#1
000458 e59f1700 LDR r1,|L1.2912|
00045c e5810000 STR r0,[r1,#0] ; OSCtxSwCtr
;;;190 OSIntCtxSw(); /* Perform interrupt level ctx switch */
;;;191 }
;;;192 }
;;;193 OS_EXIT_CRITICAL();
;;;194 }
;;;195 }
|L1.1120|
000460 e8bd4010 POP {r4,lr}
000464 e12fff1e BX lr
|L1.1128|
000468 ef000003 SVC 0x3 ; formerly SWI ;193
|L1.1132|
00046c eafffffb B |L1.1120|
ENDP
OSSchedLock PROC
;;;214 void OSSchedLock (void)
;;;215 {
000470 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 */
000474 e59f06e0 LDR r0,|L1.2908|
000478 e5d00000 LDRB r0,[r0,#0] ; OSRunning
00047c e3500001 CMP r0,#1
000480 1a00000a BNE |L1.1200|
;;;222 OS_ENTER_CRITICAL();
000484 ef000002 SVC 0x2 ; formerly SWI
;;;223 if (OSLockNesting < 255) { /* Prevent OSLockNesting from wrapping back to 0 */
000488 e59f06c4 LDR r0,|L1.2900|
00048c e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000490 e35000ff CMP r0,#0xff
000494 aa000004 BGE |L1.1196|
;;;224 OSLockNesting++; /* Increment lock nesting level */
000498 e59f06b4 LDR r0,|L1.2900|
00049c e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0004a0 e2800001 ADD r0,r0,#1
0004a4 e59f16a8 LDR r1,|L1.2900|
0004a8 e5c10000 STRB r0,[r1,#0] ; OSLockNesting
;;;225 }
;;;226 OS_EXIT_CRITICAL();
|L1.1196|
0004ac ef000003 SVC 0x3 ; formerly SWI
;;;227 }
;;;228 }
|L1.1200|
0004b0 e8bd4010 POP {r4,lr}
0004b4 e12fff1e BX lr
ENDP
OS_Sched PROC
;;;869 void OS_Sched (void)
;;;870 {
0004b8 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();
0004bc ef000002 SVC 0x2 ; formerly SWI
;;;878 if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */
0004c0 e59f0688 LDR r0,|L1.2896|
0004c4 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0004c8 e3500000 CMP r0,#0
0004cc 1a000020 BNE |L1.1364|
0004d0 e59f067c LDR r0,|L1.2900|
0004d4 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0004d8 e3500000 CMP r0,#0
0004dc 1a00001c BNE |L1.1364|
;;;879 y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */
0004e0 e59f067c LDR r0,|L1.2916|
0004e4 e59f1648 LDR r1,|L1.2868|
0004e8 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
0004ec e7d04001 LDRB r4,[r0,r1]
;;;880 OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
0004f0 e59f0640 LDR r0,|L1.2872|
0004f4 e7d00004 LDRB r0,[r0,r4]
0004f8 e59f1664 LDR r1,|L1.2916|
0004fc e7d10000 LDRB r0,[r1,r0]
000500 e0800184 ADD r0,r0,r4,LSL #3
000504 e59f1634 LDR r1,|L1.2880|
000508 e5c10000 STRB r0,[r1,#0] ; OSPrioHighRdy
;;;881 if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
00050c e2810000 ADD r0,r1,#0
000510 e5d00000 LDRB r0,[r0,#0] ; OSPrioHighRdy
000514 e59f1620 LDR r1,|L1.2876|
000518 e5d11000 LDRB r1,[r1,#0] ; OSPrioCur
00051c e1500001 CMP r0,r1
000520 0a00000b BEQ |L1.1364|
;;;882 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
000524 e59f05fc LDR r0,|L1.2856|
000528 e59f1610 LDR r1,|L1.2880|
00052c e5d11000 LDRB r1,[r1,#0] ; OSPrioHighRdy
000530 e7900101 LDR r0,[r0,r1,LSL #2]
000534 e59f1608 LDR r1,|L1.2884|
000538 e5810000 STR r0,[r1,#0] ; OSTCBHighRdy
;;;883 OSCtxSwCtr++; /* Increment context switch counter */
00053c e59f061c LDR r0,|L1.2912|
000540 e5900000 LDR r0,[r0,#0] ; OSCtxSwCtr
000544 e2800001 ADD r0,r0,#1
000548 e59f1610 LDR r1,|L1.2912|
00054c e5810000 STR r0,[r1,#0] ; OSCtxSwCtr
;;;884 OS_TASK_SW(); /* Perform a context switch */
000550 ef000000 SVC 0x0 ; formerly SWI
;;;885 }
;;;886 }
;;;887 OS_EXIT_CRITICAL();
|L1.1364|
000554 ef000003 SVC 0x3 ; formerly SWI
;;;888 }
000558 e8bd4010 POP {r4,lr}
00055c e12fff1e BX lr
ENDP
OSSchedUnlock PROC
;;;248 void OSSchedUnlock (void)
;;;249 {
000560 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 */
000564 e59f05f0 LDR r0,|L1.2908|
000568 e5d00000 LDRB r0,[r0,#0] ; OSRunning
00056c e3500001 CMP r0,#1
000570 1a000017 BNE |L1.1492|
;;;256 OS_ENTER_CRITICAL();
000574 ef000002 SVC 0x2 ; formerly SWI
;;;257 if (OSLockNesting > 0) { /* Do not decrement if already 0 */
000578 e59f05d4 LDR r0,|L1.2900|
00057c e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000580 e3500000 CMP r0,#0
000584 da000011 BLE |L1.1488|
;;;258 OSLockNesting--; /* Decrement lock nesting level */
000588 e59f05c4 LDR r0,|L1.2900|
00058c e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000590 e2400001 SUB r0,r0,#1
000594 e59f15b8 LDR r1,|L1.2900|
000598 e5c10000 STRB r0,[r1,#0] ; OSLockNesting
;;;259 if ((OSLockNesting == 0) && (OSIntNesting == 0)) { /* See if sched. enabled and not an ISR */
00059c e2810000 ADD r0,r1,#0
0005a0 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0005a4 e3500000 CMP r0,#0
0005a8 1a000006 BNE |L1.1480|
0005ac e59f059c LDR r0,|L1.2896|
0005b0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0005b4 e3500000 CMP r0,#0
0005b8 1a000002 BNE |L1.1480|
;;;260 OS_EXIT_CRITICAL();
0005bc ef000003 SVC 0x3 ; formerly SWI
;;;261 OS_Sched(); /* See if a HPT is ready */
0005c0 ebfffffe BL OS_Sched
0005c4 ea000002 B |L1.1492|
;;;262 } else {
;;;263 OS_EXIT_CRITICAL();
|L1.1480|
0005c8 ef000003 SVC 0x3 ; formerly SWI
0005cc ea000000 B |L1.1492|
;;;264 }
;;;265 } else {
;;;266 OS_EXIT_CRITICAL();
|L1.1488|
0005d0 ef000003 SVC 0x3 ; formerly SWI
;;;267 }
;;;268 }
;;;269 }
|L1.1492|
0005d4 e8bd4010 POP {r4,lr}
0005d8 e12fff1e BX lr
ENDP
OSStart PROC
;;;293 void OSStart (void)
;;;294 {
0005dc e92d4070 PUSH {r4-r6,lr}
;;;295 INT8U y;
;;;296 INT8U x;
;;;297
;;;298
;;;299 if (OSRunning == FALSE) {
0005e0 e59f0574 LDR r0,|L1.2908|
0005e4 e5d00000 LDRB r0,[r0,#0] ; OSRunning
0005e8 e3500000 CMP r0,#0
0005ec 1a000019 BNE |L1.1624|
;;;300 y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
0005f0 e59f056c LDR r0,|L1.2916|
0005f4 e59f1538 LDR r1,|L1.2868|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -