📄 os_core.txt
字号:
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 + -