📄 os_core.txt
字号:
000398 ef000003 SVC 0x3 ; formerly SWI
;;;754 }
00039c e8bd8010 POP {r4,pc}
ENDP
OSSchedUnlock PROC
;;;369 void OSSchedUnlock (void)
;;;370 {
0003a0 e92d4010 PUSH {r4,lr}
;;;371 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;372 OS_CPU_SR cpu_sr;
;;;373 #endif
;;;374
;;;375
;;;376 if (OSRunning == TRUE) { /* Make sure multitasking is running */
0003a4 e59f0524 LDR r0,|L1.2256|
0003a8 e5d00000 LDRB r0,[r0,#0] ; OSRunning
0003ac e3500001 CMP r0,#1
0003b0 1a000017 BNE |L1.1044|
;;;377 OS_ENTER_CRITICAL();
0003b4 ef000002 SVC 0x2 ; formerly SWI
;;;378 if (OSLockNesting > 0) { /* Do not decrement if already 0 */
0003b8 e59f0508 LDR r0,|L1.2248|
0003bc e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0003c0 e3500000 CMP r0,#0
0003c4 da000011 BLE |L1.1040|
;;;379 OSLockNesting--; /* Decrement lock nesting level */
0003c8 e59f04f8 LDR r0,|L1.2248|
0003cc e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0003d0 e2400001 SUB r0,r0,#1
0003d4 e59f14ec LDR r1,|L1.2248|
0003d8 e5c10000 STRB r0,[r1,#0] ; OSLockNesting
;;;380 if ((OSLockNesting == 0) && (OSIntNesting == 0)) { /* See if sched. enabled and not an ISR */
0003dc e2810000 ADD r0,r1,#0
0003e0 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0003e4 e3500000 CMP r0,#0
0003e8 1a000006 BNE |L1.1032|
0003ec e59f04d0 LDR r0,|L1.2244|
0003f0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0003f4 e3500000 CMP r0,#0
0003f8 1a000002 BNE |L1.1032|
;;;381 OS_EXIT_CRITICAL();
0003fc ef000003 SVC 0x3 ; formerly SWI
;;;382 OS_Sched(); /* See if a HPT is ready */
000400 ebfffffe BL OS_Sched
000404 ea000002 B |L1.1044|
;;;383 } else {
;;;384 OS_EXIT_CRITICAL();
|L1.1032|
000408 ef000003 SVC 0x3 ; formerly SWI
00040c ea000000 B |L1.1044|
;;;385 }
;;;386 } else {
;;;387 OS_EXIT_CRITICAL();
|L1.1040|
000410 ef000003 SVC 0x3 ; formerly SWI
;;;388 }
;;;389 }
;;;390 }
|L1.1044|
000414 e8bd8010 POP {r4,pc}
ENDP
OSStart PROC
;;;412 void OSStart (void)
;;;413 {
000418 e92d4070 PUSH {r4-r6,lr}
;;;414 INT8U y;
;;;415 INT8U x;
;;;416
;;;417
;;;418 if (OSRunning == FALSE) {
00041c e59f04ac LDR r0,|L1.2256|
000420 e5d00000 LDRB r0,[r0,#0] ; OSRunning
000424 e3500000 CMP r0,#0
000428 1a000019 BNE |L1.1172|
;;;419 y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
00042c e59f04d8 LDR r0,|L1.2316|
000430 e59f14a0 LDR r1,|L1.2264|
000434 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
000438 e7d04001 LDRB r4,[r0,r1]
;;;420 x = OSUnMapTbl[OSRdyTbl[y]];
00043c e59f0498 LDR r0,|L1.2268|
000440 e7d00004 LDRB r0,[r0,r4]
000444 e59f14c0 LDR r1,|L1.2316|
000448 e7d15000 LDRB r5,[r1,r0]
;;;421 OSPrioHighRdy = (INT8U)((y << 3) + x);
00044c e0850184 ADD r0,r5,r4,LSL #3
000450 e59f148c LDR r1,|L1.2276|
000454 e5c10000 STRB r0,[r1,#0] ; OSPrioHighRdy
;;;422 OSPrioCur = OSPrioHighRdy;
000458 e2810000 ADD r0,r1,#0
00045c e5d00000 LDRB r0,[r0,#0] ; OSPrioHighRdy
000460 e59f1478 LDR r1,|L1.2272|
000464 e5c10000 STRB r0,[r1,#0] ; OSPrioCur
;;;423 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
000468 e59f0484 LDR r0,|L1.2292|
00046c e59f1470 LDR r1,|L1.2276|
000470 e5d11000 LDRB r1,[r1,#0] ; OSPrioHighRdy
000474 e7900101 LDR r0,[r0,r1,LSL #2]
000478 e59f1468 LDR r1,|L1.2280|
00047c e5810000 STR r0,[r1,#0] ; OSTCBHighRdy
;;;424 OSTCBCur = OSTCBHighRdy;
000480 e2810000 ADD r0,r1,#0
000484 e5900000 LDR r0,[r0,#0] ; OSTCBHighRdy
000488 e59f145c LDR r1,|L1.2284|
00048c e5810000 STR r0,[r1,#0] ; OSTCBCur
;;;425 OSStartHighRdy(); /* Execute target specific code to start task */
000490 ebfffffe BL OSStartHighRdy
;;;426 }
;;;427 }
|L1.1172|
000494 e8bd8070 POP {r4-r6,pc}
ENDP
OSTimeTick PROC
;;;483 void OSTimeTick (void)
;;;484 {
000498 e92d4010 PUSH {r4,lr}
;;;485 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;486 OS_CPU_SR cpu_sr;
;;;487 #endif
;;;488 OS_TCB *ptcb;
;;;489
;;;490
;;;491 OSTimeTickHook(); /* Call user definable hook */
00049c ebfffffe BL OSTimeTickHook
;;;492 #if OS_TIME_GET_SET_EN > 0
;;;493 OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
0004a0 ef000002 SVC 0x2 ; formerly SWI
;;;494 OSTime++;
0004a4 e59f0414 LDR r0,|L1.2240|
0004a8 e5900000 LDR r0,[r0,#0] ; OSTime
0004ac e2800001 ADD r0,r0,#1
0004b0 e59f1408 LDR r1,|L1.2240|
0004b4 e5810000 STR r0,[r1,#0] ; OSTime
;;;495 OS_EXIT_CRITICAL();
0004b8 ef000003 SVC 0x3 ; formerly SWI
;;;496 #endif
;;;497 ptcb = OSTCBList; /* Point at first TCB in TCB list */
0004bc e59f042c LDR r0,|L1.2288|
0004c0 e5904000 LDR r4,[r0,#0] ; OSTCBList
;;;498 while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
0004c4 ea00001f B |L1.1352|
;;;499 OS_ENTER_CRITICAL();
|L1.1224|
0004c8 ef000002 SVC 0x2 ; formerly SWI
;;;500 if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0004cc e1d401ba LDRH r0,[r4,#0x1a]
0004d0 e3500000 CMP r0,#0
0004d4 0a000019 BEQ |L1.1344|
;;;501 if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
0004d8 e1d401ba LDRH r0,[r4,#0x1a]
0004dc e2400001 SUB r0,r0,#1
0004e0 e1a00800 LSL r0,r0,#16
0004e4 e1b00820 LSRS r0,r0,#16
0004e8 e1c401ba STRH r0,[r4,#0x1a]
0004ec 1a000013 BNE |L1.1344|
;;;502 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == 0x00) { /* Is task suspended? */
0004f0 e5d4001c LDRB r0,[r4,#0x1c]
0004f4 e3100008 TST r0,#8
0004f8 1a00000e BNE |L1.1336|
;;;503 OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
0004fc e5d40021 LDRB r0,[r4,#0x21]
000500 e59f13d0 LDR r1,|L1.2264|
000504 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
000508 e1800001 ORR r0,r0,r1
00050c e59f13c4 LDR r1,|L1.2264|
000510 e5c10000 STRB r0,[r1,#0] ; OSRdyGrp
;;;504 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000514 e5d4001f LDRB r0,[r4,#0x1f]
000518 e59f13bc LDR r1,|L1.2268|
00051c e7d10000 LDRB r0,[r1,r0]
000520 e5d41020 LDRB r1,[r4,#0x20]
000524 e1800001 ORR r0,r0,r1
000528 e5d4101f LDRB r1,[r4,#0x1f]
00052c e59f23a8 LDR r2,|L1.2268|
000530 e7c20001 STRB r0,[r2,r1]
000534 ea000001 B |L1.1344|
;;;505 } else { /* Yes, Leave 1 tick to prevent ... */
;;;506 ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
|L1.1336|
000538 e3a00001 MOV r0,#1
00053c e1c401ba STRH r0,[r4,#0x1a]
;;;507 } /* ... suspension is removed. */
;;;508 }
;;;509 }
;;;510 ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
|L1.1344|
000540 e5944004 LDR r4,[r4,#4]
;;;511 OS_EXIT_CRITICAL();
000544 ef000003 SVC 0x3 ; formerly SWI
|L1.1352|
000548 e5d4001d LDRB r0,[r4,#0x1d] ;498
00054c e350000c CMP r0,#0xc ;498
000550 1affffdc BNE |L1.1224| ;498
;;;512 }
;;;513 }
000554 e8bd8010 POP {r4,pc}
ENDP
OSVersion PROC
;;;530 {
;;;531 return (OS_VERSION);
000558 e3a000fb MOV r0,#0xfb
;;;532 }
00055c e12fff1e BX lr
ENDP
OS_Dummy PROC
;;;549 {
;;;550 }
000560 e12fff1e BX lr
ENDP
OS_EventTaskRdy PROC
;;;576 INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
;;;577 {
000564 e92d41f0 PUSH {r4-r8,lr}
000568 e1a03000 MOV r3,r0
;;;578 OS_TCB *ptcb;
;;;579 INT8U x;
;;;580 INT8U y;
;;;581 INT8U bitx;
;;;582 INT8U bity;
;;;583 INT8U prio;
;;;584
;;;585
;;;586 y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
00056c e5d37001 LDRB r7,[r3,#1]
000570 e59f8394 LDR r8,|L1.2316|
000574 e7d84007 LDRB r4,[r8,r7]
;;;587 bity = OSMapTbl[y];
000578 e59f7394 LDR r7,|L1.2324|
00057c e7d76004 LDRB r6,[r7,r4]
;;;588 x = OSUnMapTbl[pevent->OSEventTbl[y]];
000580 e2837008 ADD r7,r3,#8
000584 e7d77004 LDRB r7,[r7,r4]
000588 e7d8e007 LDRB lr,[r8,r7]
;;;589 bitx = OSMapTbl[x];
00058c e59f7380 LDR r7,|L1.2324|
000590 e7d7500e LDRB r5,[r7,lr]
;;;590 prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
000594 e08e7184 ADD r7,lr,r4,LSL #3
000598 e20700ff AND r0,r7,#0xff
;;;591 if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) { /* Remove this task from the waiting list */
00059c e2837008 ADD r7,r3,#8
0005a0 e7d77004 LDRB r7,[r7,r4]
0005a4 e1c77005 BIC r7,r7,r5
0005a8 e21770ff ANDS r7,r7,#0xff
0005ac e2838008 ADD r8,r3,#8
0005b0 e7c87004 STRB r7,[r8,r4]
0005b4 1a000002 BNE |L1.1476|
;;;592 pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
0005b8 e5d37001 LDRB r7,[r3,#1]
0005bc e1c77006 BIC r7,r7,r6
0005c0 e5c37001 STRB r7,[r3,#1]
;;;593 }
;;;594 ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
|L1.1476|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -