📄 os_core.txt
字号:
;;;1183 pevent = *pevents;
0000ee 6808 LDR r0,[r1,#0]
;;;1184 while (pevent != (OS_EVENT *)0) { /* Remove task from all events' wait lists */
0000f0 e00a B |L1.264|
|L1.242|
;;;1185 pevent->OSEventTbl[y] &= ~bitx;
0000f2 1902 ADDS r2,r0,r4
0000f4 7ad3 LDRB r3,[r2,#0xb]
0000f6 43b3 BICS r3,r3,r6
0000f8 72d3 STRB r3,[r2,#0xb]
;;;1186 if (pevent->OSEventTbl[y] == 0) {
0000fa 7ad2 LDRB r2,[r2,#0xb]
0000fc b912 CBNZ r2,|L1.260|
;;;1187 pevent->OSEventGrp &= ~bity;
0000fe 7a82 LDRB r2,[r0,#0xa]
000100 43aa BICS r2,r2,r5
000102 7282 STRB r2,[r0,#0xa]
|L1.260|
;;;1188 }
;;;1189 pevents++;
;;;1190 pevent = *pevents;
000104 f851f851 LDR r0,[r1,#4]!
|L1.264|
000108 2800 CMP r0,#0 ;1184
00010a d1f2 BNE |L1.242|
;;;1191 }
;;;1192 }
00010c bd70 POP {r4-r6,pc}
;;;1193 #endif
ENDP
OS_SchedNew PROC
;;;1653
;;;1654 y = OSUnMapTbl[OSRdyGrp];
00010e 49c5 LDR r1,|L1.1060|
000110 4ac5 LDR r2,|L1.1064|
000112 7988 LDRB r0,[r1,#6] ; OSRdyGrp
000114 5c10 LDRB r0,[r2,r0]
;;;1655 OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
000116 f101f101 ADD r3,r1,#0x1c
00011a 5c1b LDRB r3,[r3,r0]
00011c 5cd2 LDRB r2,[r2,r3]
00011e eb02eb02 ADD r0,r2,r0,LSL #3
000122 7148 STRB r0,[r1,#5] ; OSPrioHighRdy
;;;1656 #else /* We support up to 256 tasks */
;;;1657 INT8U y;
;;;1658 INT16U *ptbl;
;;;1659
;;;1660
;;;1661 if ((OSRdyGrp & 0xFF) != 0) {
;;;1662 y = OSUnMapTbl[OSRdyGrp & 0xFF];
;;;1663 } else {
;;;1664 y = OSUnMapTbl[(OSRdyGrp >> 8) & 0xFF] + 8;
;;;1665 }
;;;1666 ptbl = &OSRdyTbl[y];
;;;1667 if ((*ptbl & 0xFF) != 0) {
;;;1668 OSPrioHighRdy = (INT8U)((y << 4) + OSUnMapTbl[(*ptbl & 0xFF)]);
;;;1669 } else {
;;;1670 OSPrioHighRdy = (INT8U)((y << 4) + OSUnMapTbl[(*ptbl >> 8) & 0xFF] + 8);
;;;1671 }
;;;1672 #endif
;;;1673 }
000124 4770 BX lr
;;;1674
ENDP
OS_Sched PROC
;;;1606 void OS_Sched (void)
;;;1607 {
000126 b570 PUSH {r4-r6,lr}
;;;1608 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1609 OS_CPU_SR cpu_sr = 0;
;;;1610 #endif
;;;1611
;;;1612
;;;1613
;;;1614 OS_ENTER_CRITICAL();
000128 f7fff7ff BL OS_CPU_SR_Save
00012c 4605 MOV r5,r0
;;;1615 if (OSIntNesting == 0) { /* Schedule only if all ISRs done and ... */
00012e 4cbd LDR r4,|L1.1060|
000130 78a0 LDRB r0,[r4,#2] ; OSIntNesting
000132 b998 CBNZ r0,|L1.348|
;;;1616 if (OSLockNesting == 0) { /* ... scheduler is not locked */
000134 78e0 LDRB r0,[r4,#3] ; OSLockNesting
000136 b988 CBNZ r0,|L1.348|
;;;1617 OS_SchedNew();
000138 f7fff7ff BL OS_SchedNew
;;;1618 if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
00013c 7961 LDRB r1,[r4,#5] ; OSPrioHighRdy
00013e 7920 LDRB r0,[r4,#4] ; OSPrioCur
000140 4281 CMP r1,r0
000142 d00b BEQ |L1.348|
;;;1619 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
000144 48b9 LDR r0,|L1.1068|
000146 f850f850 LDR r1,[r0,r1,LSL #2]
00014a 62e1 STR r1,[r4,#0x2c] ; OSTCBHighRdy
;;;1620 #if OS_TASK_PROFILE_EN > 0
;;;1621 OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
00014c 6b88 LDR r0,[r1,#0x38]
00014e 1c40 ADDS r0,r0,#1
000150 6388 STR r0,[r1,#0x38]
;;;1622 #endif
;;;1623 OSCtxSwCtr++; /* Increment context switch counter */
000152 68e0 LDR r0,[r4,#0xc] ; OSCtxSwCtr
000154 1c40 ADDS r0,r0,#1
000156 60e0 STR r0,[r4,#0xc] ; OSCtxSwCtr
;;;1624 OS_TASK_SW(); /* Perform a context switch */
000158 f7fff7ff BL OSCtxSw
|L1.348|
;;;1625 }
;;;1626 }
;;;1627 }
;;;1628 OS_EXIT_CRITICAL();
00015c 4628 MOV r0,r5
00015e e8bde8bd POP {r4-r6,lr}
000162 f7fff7ff B.W OS_CPU_SR_Restore
;;;1629 }
;;;1630
ENDP
OS_EventTaskWaitMulti PROC
;;;1091 void OS_EventTaskWaitMulti (OS_EVENT **pevents_wait)
;;;1092 {
000166 b570 PUSH {r4-r6,lr}
;;;1093 OS_EVENT **pevents;
;;;1094 OS_EVENT *pevent;
;;;1095 INT8U y;
;;;1096
;;;1097
;;;1098 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
000168 4dae LDR r5,|L1.1060|
00016a 2200 MOVS r2,#0
00016c 6a69 LDR r1,[r5,#0x24] ; OSTCBCur
00016e 61ca STR r2,[r1,#0x1c]
;;;1099 OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)pevents_wait; /* Store ptr to ECBs in TCB */
000170 6208 STR r0,[r1,#0x20]
;;;1100
;;;1101 pevents = pevents_wait;
;;;1102 pevent = *pevents;
000172 6801 LDR r1,[r0,#0]
;;;1103 while (pevent != (OS_EVENT *)0) { /* Put task in waiting lists */
000174 e010 B |L1.408|
|L1.374|
;;;1104 pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
000176 6a6b LDR r3,[r5,#0x24] ; OSTCBCur
000178 f101f101 ADD r2,r1,#0xb
00017c f813f813 LDRB r4,[r3,#0x34]!
000180 785b LDRB r3,[r3,#1]
000182 5ca6 LDRB r6,[r4,r2]
000184 431e ORRS r6,r6,r3
000186 54a6 STRB r6,[r4,r2]
;;;1105 pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
000188 6a6b LDR r3,[r5,#0x24] ; OSTCBCur
00018a 7a8a LDRB r2,[r1,#0xa]
00018c f893f893 LDRB r3,[r3,#0x36]
000190 431a ORRS r2,r2,r3
000192 728a STRB r2,[r1,#0xa]
;;;1106 pevents++;
;;;1107 pevent = *pevents;
000194 f850f850 LDR r1,[r0,#4]!
|L1.408|
000198 2900 CMP r1,#0 ;1103
00019a d1ec BNE |L1.374|
;;;1108 }
;;;1109
;;;1110 y = OSTCBCur->OSTCBY; /* Task no longer ready */
00019c 6a69 LDR r1,[r5,#0x24] ; OSTCBCur
00019e f891f891 LDRB r0,[r1,#0x34]
;;;1111 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
0001a2 4aa0 LDR r2,|L1.1060|
0001a4 f891f891 LDRB r4,[r1,#0x35]
0001a8 321c ADDS r2,r2,#0x1c
0001aa 5c13 LDRB r3,[r2,r0]
0001ac 43a3 BICS r3,r3,r4
0001ae 5413 STRB r3,[r2,r0]
;;;1112 if (OSRdyTbl[y] == 0) {
0001b0 5c10 LDRB r0,[r2,r0]
0001b2 2800 CMP r0,#0
0001b4 d104 BNE |L1.448|
;;;1113 OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
0001b6 f891f891 LDRB r1,[r1,#0x36]
0001ba 79a8 LDRB r0,[r5,#6] ; OSRdyGrp
0001bc 4388 BICS r0,r0,r1
0001be 71a8 STRB r0,[r5,#6] ; OSRdyGrp
|L1.448|
;;;1114 }
;;;1115 }
0001c0 bd70 POP {r4-r6,pc}
;;;1116 #endif
ENDP
OSEventPendMulti PROC
;;;306 INT16U OSEventPendMulti (OS_EVENT **pevents_pend, OS_EVENT **pevents_rdy, void **pmsgs_rdy, INT16U timeout, INT8U *perr)
;;;307 {
0001c2 e92de92d PUSH {r0-r12,lr}
0001c6 f8ddf8dd LDR r8,[sp,#0x38]
0001ca 460d MOV r5,r1
0001cc 4616 MOV r6,r2
;;;308 OS_EVENT **pevents;
;;;309 OS_EVENT *pevent;
;;;310 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
;;;311 OS_Q *pq;
;;;312 #endif
;;;313 BOOLEAN events_rdy;
;;;314 INT16U events_rdy_nbr;
;;;315 INT8U events_stat;
;;;316 #if (OS_CRITICAL_METHOD == 3) /* Allocate storage for CPU status register */
;;;317 OS_CPU_SR cpu_sr = 0;
;;;318 #endif
;;;319
;;;320
;;;321
;;;322 #if (OS_ARG_CHK_EN > 0)
;;;323 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;324 return (0);
;;;325 }
;;;326 if (pevents_pend == (OS_EVENT **)0) { /* Validate 'pevents_pend' */
;;;327 *perr = OS_ERR_PEVENT_NULL;
;;;328 return (0);
;;;329 }
;;;330 if (pevents_rdy == (OS_EVENT **)0) { /* Validate 'pevents_rdy' */
;;;331 *perr = OS_ERR_PEVENT_NULL;
;;;332 return (0);
;;;333 }
;;;334 if (pmsgs_rdy == (void **)0) { /* Validate 'pmsgs_rdy' */
;;;335 *perr = OS_ERR_PEVENT_NULL;
;;;336 return (0);
;;;337 }
;;;338 #endif
;;;339
;;;340 *pevents_rdy = (OS_EVENT *)0; /* Init array to NULL in case of errors */
0001ce f04ff04f MOV r9,#0
0001d2 f8c5f8c5 STR r9,[r5,#0]
;;;341
;;;342 pevents = pevents_pend;
0001d6 9800 LDR r0,[sp,#0]
;;;343 pevent = *pevents;
0001d8 6801 LDR r1,[r0,#0]
;;;344 while (pevent != (OS_EVENT *)0) {
0001da f04ff04f MOV r11,#1
0001de e00c B |L1.506|
|L1.480|
;;;345 switch (pevent->OSEventType) { /* Validate event block types */
0001e0 7809 LDRB r1,[r1,#0]
0001e2 2901 CMP r1,#1
0001e4 d007 BEQ |L1.502|
0001e6 2903 CMP r1,#3
0001e8 d005 BEQ |L1.502|
;;;346 #if (OS_SEM_EN > 0)
;;;347 case OS_EVENT_TYPE_SEM:
;;;348 break;
;;;349 #endif
;;;350 #if (OS_MBOX_EN > 0)
;;;351 case OS_EVENT_TYPE_MBOX:
;;;352 break;
;;;353 #endif
;;;354 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
;;;355 case OS_EVENT_TYPE_Q:
;;;356 break;
;;;357 #endif
;;;358
;;;359 case OS_EVENT_TYPE_MUTEX:
;;;360 case OS_EVENT_TYPE_FLAG:
;;;361 default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -