📄 os_core.txt
字号:
0005f8 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
0005fc e7d04001 LDRB r4,[r0,r1]
;;;301 x = OSUnMapTbl[OSRdyTbl[y]];
000600 e59f0530 LDR r0,|L1.2872|
000604 e7d00004 LDRB r0,[r0,r4]
000608 e59f1554 LDR r1,|L1.2916|
00060c e7d15000 LDRB r5,[r1,r0]
;;;302 OSPrioHighRdy = (INT8U)((y << 3) + x);
000610 e0850184 ADD r0,r5,r4,LSL #3
000614 e59f1524 LDR r1,|L1.2880|
000618 e5c10000 STRB r0,[r1,#0] ; OSPrioHighRdy
;;;303 OSPrioCur = OSPrioHighRdy;
00061c e2810000 ADD r0,r1,#0
000620 e5d00000 LDRB r0,[r0,#0] ; OSPrioHighRdy
000624 e59f1510 LDR r1,|L1.2876|
000628 e5c10000 STRB r0,[r1,#0] ; OSPrioCur
;;;304 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
00062c e59f04f4 LDR r0,|L1.2856|
000630 e59f1508 LDR r1,|L1.2880|
000634 e5d11000 LDRB r1,[r1,#0] ; OSPrioHighRdy
000638 e7900101 LDR r0,[r0,r1,LSL #2]
00063c e59f1500 LDR r1,|L1.2884|
000640 e5810000 STR r0,[r1,#0] ; OSTCBHighRdy
;;;305 OSTCBCur = OSTCBHighRdy;
000644 e2810000 ADD r0,r1,#0
000648 e5900000 LDR r0,[r0,#0] ; OSTCBHighRdy
00064c e59f14f4 LDR r1,|L1.2888|
000650 e5810000 STR r0,[r1,#0] ; OSTCBCur
;;;306 OSStartHighRdy(); /* Execute target specific code to start task */
000654 ebfffffe BL OSStartHighRdy
;;;307 }
;;;308 }
|L1.1624|
000658 e8bd4070 POP {r4-r6,lr}
00065c e12fff1e BX lr
ENDP
OSStatInit PROC
;;;331 void OSStatInit (void)
;;;332 {
000660 e92d4010 PUSH {r4,lr}
;;;333 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;334 OS_CPU_SR cpu_sr;
;;;335 #endif
;;;336
;;;337
;;;338 OSTimeDly(2); /* Synchronize with clock tick */
000664 e3a00002 MOV r0,#2
000668 ebfffffe BL OSTimeDly
;;;339 OS_ENTER_CRITICAL();
00066c ef000002 SVC 0x2 ; formerly SWI
;;;340 OSIdleCtr = 0L; /* Clear idle counter */
000670 e3a00000 MOV r0,#0
000674 e59f1480 LDR r1,|L1.2812|
000678 e5810000 STR r0,[r1,#0] ; OSIdleCtr
;;;341 OS_EXIT_CRITICAL();
00067c ef000003 SVC 0x3 ; formerly SWI
;;;342 OSTimeDly(OS_TICKS_PER_SEC); /* Determine MAX. idle counter value for 1 second */
000680 e3a000c8 MOV r0,#0xc8
000684 ebfffffe BL OSTimeDly
;;;343 OS_ENTER_CRITICAL();
000688 ef000002 SVC 0x2 ; formerly SWI
;;;344 OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1 second */
00068c e59f0468 LDR r0,|L1.2812|
000690 e5900000 LDR r0,[r0,#0] ; OSIdleCtr
000694 e59f145c LDR r1,|L1.2808|
000698 e5810000 STR r0,[r1,#0] ; OSIdleCtrMax
;;;345 OSStatRdy = TRUE;
00069c e3a00001 MOV r0,#1
0006a0 e59f144c LDR r1,|L1.2804|
0006a4 e5c10000 STRB r0,[r1,#0] ; OSStatRdy
;;;346 OS_EXIT_CRITICAL();
0006a8 ef000003 SVC 0x3 ; formerly SWI
;;;347 }
0006ac e8bd4010 POP {r4,lr}
0006b0 e12fff1e BX lr
ENDP
OSTimeTick PROC
;;;364 void OSTimeTick (void)
;;;365 {
0006b4 e92d4010 PUSH {r4,lr}
;;;366 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;367 OS_CPU_SR cpu_sr;
;;;368 #endif
;;;369 OS_TCB *ptcb;
;;;370
;;;371
;;;372 OSTimeTickHook(); /* Call user definable hook */
0006b8 ebfffffe BL OSTimeTickHook
;;;373 #if OS_TIME_GET_SET_EN > 0
;;;374 OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
0006bc ef000002 SVC 0x2 ; formerly SWI
;;;375 OSTime++;
0006c0 e59f0484 LDR r0,|L1.2892|
0006c4 e5900000 LDR r0,[r0,#0] ; OSTime
0006c8 e2800001 ADD r0,r0,#1
0006cc e59f1478 LDR r1,|L1.2892|
0006d0 e5810000 STR r0,[r1,#0] ; OSTime
;;;376 OS_EXIT_CRITICAL();
0006d4 ef000003 SVC 0x3 ; formerly SWI
;;;377 #endif
;;;378 if (OSRunning == TRUE) {
0006d8 e59f047c LDR r0,|L1.2908|
0006dc e5d00000 LDRB r0,[r0,#0] ; OSRunning
0006e0 e3500001 CMP r0,#1
0006e4 1a000025 BNE |L1.1920|
;;;379 ptcb = OSTCBList; /* Point at first TCB in TCB list */
0006e8 e59f0434 LDR r0,|L1.2852|
0006ec e5904000 LDR r4,[r0,#0] ; OSTCBList
;;;380 while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
0006f0 ea00001f B |L1.1908|
;;;381 OS_ENTER_CRITICAL();
|L1.1780|
0006f4 ef000002 SVC 0x2 ; formerly SWI
;;;382 if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
0006f8 e1d402ba LDRH r0,[r4,#0x2a]
0006fc e3500000 CMP r0,#0
000700 0a000019 BEQ |L1.1900|
;;;383 if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
000704 e1d402ba LDRH r0,[r4,#0x2a]
000708 e2400001 SUB r0,r0,#1
00070c e1a00800 LSL r0,r0,#16
000710 e1b00820 LSRS r0,r0,#16
000714 e1c402ba STRH r0,[r4,#0x2a]
000718 1a000013 BNE |L1.1900|
;;;384 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
00071c e5d4002c LDRB r0,[r4,#0x2c]
000720 e3100008 TST r0,#8
000724 1a00000e BNE |L1.1892|
;;;385 OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
000728 e5d40031 LDRB r0,[r4,#0x31]
00072c e59f1400 LDR r1,|L1.2868|
000730 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
000734 e1800001 ORR r0,r0,r1
000738 e59f13f4 LDR r1,|L1.2868|
00073c e5c10000 STRB r0,[r1,#0] ; OSRdyGrp
;;;386 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000740 e5d4002f LDRB r0,[r4,#0x2f]
000744 e59f13ec LDR r1,|L1.2872|
000748 e7d10000 LDRB r0,[r1,r0]
00074c e5d41030 LDRB r1,[r4,#0x30]
000750 e1800001 ORR r0,r0,r1
000754 e5d4102f LDRB r1,[r4,#0x2f]
000758 e59f23d8 LDR r2,|L1.2872|
00075c e7c20001 STRB r0,[r2,r1]
000760 ea000001 B |L1.1900|
;;;387 } else { /* Yes, Leave 1 tick to prevent ... */
;;;388 ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
|L1.1892|
000764 e3a00001 MOV r0,#1
000768 e1c402ba STRH r0,[r4,#0x2a]
;;;389 } /* ... suspension is removed. */
;;;390 }
;;;391 }
;;;392 ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
|L1.1900|
00076c e5944014 LDR r4,[r4,#0x14]
;;;393 OS_EXIT_CRITICAL();
000770 ef000003 SVC 0x3 ; formerly SWI
|L1.1908|
000774 e5d4002d LDRB r0,[r4,#0x2d] ;380
000778 e350000c CMP r0,#0xc ;380
00077c 1affffdc BNE |L1.1780| ;380
;;;394 }
;;;395 }
;;;396 }
|L1.1920|
000780 e8bd4010 POP {r4,lr}
000784 e12fff1e BX lr
ENDP
OSVersion PROC
;;;413 {
;;;414 return (OS_VERSION);
000788 e3a000fc MOV r0,#0xfc
;;;415 }
00078c e12fff1e BX lr
ENDP
OS_Dummy PROC
;;;432 {
;;;433 }
000790 e12fff1e BX lr
ENDP
OS_EventTaskRdy PROC
;;;459 INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
;;;460 {
000794 e92d41f0 PUSH {r4-r8,lr}
000798 e1a03000 MOV r3,r0
;;;461 OS_TCB *ptcb;
;;;462 INT8U x;
;;;463 INT8U y;
;;;464 INT8U bitx;
;;;465 INT8U bity;
;;;466 INT8U prio;
;;;467
;;;468
;;;469 y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
00079c e5d37001 LDRB r7,[r3,#1]
0007a0 e59f83bc LDR r8,|L1.2916|
0007a4 e7d84007 LDRB r4,[r8,r7]
;;;470 bity = OSMapTbl[y];
0007a8 e59f73bc LDR r7,|L1.2924|
0007ac e7d76004 LDRB r6,[r7,r4]
;;;471 x = OSUnMapTbl[pevent->OSEventTbl[y]];
0007b0 e2837008 ADD r7,r3,#8
0007b4 e7d77004 LDRB r7,[r7,r4]
0007b8 e7d8e007 LDRB lr,[r8,r7]
;;;472 bitx = OSMapTbl[x];
0007bc e59f73a8 LDR r7,|L1.2924|
0007c0 e7d7500e LDRB r5,[r7,lr]
;;;473 prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
0007c4 e08e7184 ADD r7,lr,r4,LSL #3
0007c8 e20700ff AND r0,r7,#0xff
;;;474 if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) { /* Remove this task from the waiting list */
0007cc e2837008 ADD r7,r3,#8
0007d0 e7d77004 LDRB r7,[r7,r4]
0007d4 e1c77005 BIC r7,r7,r5
0007d8 e21770ff ANDS r7,r7,#0xff
0007dc e2838008 ADD r8,r3,#8
0007e0 e7c87004 STRB r7,[r8,r4]
0007e4 1a000002 BNE |L1.2036|
;;;475 pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
0007e8 e5d37001 LDRB r7,[r3,#1]
0007ec e1c77006 BIC r7,r7,r6
0007f0 e5c37001 STRB r7,[r3,#1]
;;;476 }
;;;477 ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
|L1.2036|
0007f4 e59f732c LDR r7,|L1.2856|
0007f8 e797c100 LDR r12,[r7,r0,LSL #2]
;;;478 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
0007fc e3a07000 MOV r7,#0
000800 e1cc72ba STRH r7,[r12,#0x2a]
;;;479 ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
000804 e58c701c STR r7,[r12,#0x1c]
;;;480 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;;;481 ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
000808 e58c1020 STR r1,[r12,#0x20]
;;;482 #else
;;;483 msg = msg; /* Prevent compiler warning if not used */
;;;484 #endif
;;;485 ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
00080c e5dc702c LDRB r7,[r12,#0x2c]
000810 e1c77002 BIC r7,r7,r2
000814 e5cc702c STRB r7,[r12,#0x2c]
;;;486 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
000818 e5dc702c LDRB r7,[r12,#0x2c]
00081c e3570000 CMP r7,#0
000820 1a000009 BNE |L1.2124|
;;;487 OSRdyGrp |= bity; /* Put task in the ready to run list */
000824 e59f7308 LDR r7,|L1.2868|
000828 e5d77000 LDRB r7,[r7,#0] ; OSRdyGrp
00082c e1877006 ORR r7,r7,r6
000830 e59f82fc LDR r8,|L1.2868|
000834 e5c87000 STRB r7,[r8,#0] ; OSRdyGrp
;;;488 OSRdyTbl[y] |= bitx;
000838 e59f72f8 LDR r7,|L1.2872|
00083c e7d77004 LDRB r7,[r7,r4]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -