📄 os_core.txt
字号:
000404 0a000018 BEQ |L1.1132|
;;;563 if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
000408 e2411001 SUB r1,r1,#1
00040c e1a01801 LSL r1,r1,#16
000410 e1b01821 LSRS r1,r1,#16
000414 e1c411bc STRH r1,[r4,#0x1c]
000418 1a000013 BNE |L1.1132|
;;;564 /* Check for timeout */
;;;565 if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
00041c e5d4101e LDRB r1,[r4,#0x1e]
000420 e3110037 TST r1,#0x37
;;;566 ptcb->OSTCBStat &= ~OS_STAT_PEND_ANY; /* Yes, Clear status flag */
000424 13c11037 BICNE r1,r1,#0x37
000428 15c4101e STRBNE r1,[r4,#0x1e]
;;;567 ptcb->OSTCBPendTO = TRUE; /* Indicate PEND timeout */
;;;568 } else {
;;;569 ptcb->OSTCBPendTO = FALSE;
00042c 03a01000 MOVEQ r1,#0
000430 13a01001 MOVNE r1,#1 ;567
000434 e5c4101f STRB r1,[r4,#0x1f]
;;;570 }
;;;571
;;;572 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
000438 e5d4101e LDRB r1,[r4,#0x1e]
00043c e3110008 TST r1,#8
000440 1a000009 BNE |L1.1132|
;;;573 OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make ready */
000444 e5d41024 LDRB r1,[r4,#0x24]
000448 e5d52006 LDRB r2,[r5,#6] ; OSRdyGrp
00044c e1811002 ORR r1,r1,r2
000450 e5c51006 STRB r1,[r5,#6] ; OSRdyGrp
;;;574 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000454 e5d41022 LDRB r1,[r4,#0x22]
000458 e59f2064 LDR r2,|L1.1220|
00045c e5d4c023 LDRB r12,[r4,#0x23]
000460 e7d23001 LDRB r3,[r2,r1]
000464 e183300c ORR r3,r3,r12
000468 e7c23001 STRB r3,[r2,r1]
;;;575 }
;;;576 }
;;;577 }
;;;578 ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
|L1.1132|
00046c e5944014 LDR r4,[r4,#0x14]
;;;579 OS_EXIT_CRITICAL();
000470 ebfffffe BL OS_CPU_SR_Restore
|L1.1140|
000474 e5d40020 LDRB r0,[r4,#0x20] ;560
000478 e350000f CMP r0,#0xf ;560
00047c 1affffdd BNE |L1.1016| ;560
;;;580 }
;;;581 }
;;;582 }
|L1.1152|
000480 e8bd4070 POP {r4-r6,lr}
000484 e12fff1e BX lr
|L1.1160|
000488 00000400 DCD ||.bss.5|| + 1024
|L1.1164|
00048c 00000000 DCD ||.data||
|L1.1168|
000490 00000440 DCD ||.bss.5|| + 1088
|L1.1172|
000494 00000200 DCD ||.bss.5|| + 512
|L1.1176|
000498 0000ffff DCD 0x0000ffff
|L1.1180|
00049c 4f2f4375 DCB "uC/O"
0004a0 49492d53 DCB "S-II"
0004a4 6c644920 DCB " Idl"
0004a8 00000065 DCB "e\0\0\0"
|L1.1196|
0004ac 00000000 DCD ||.bss.5||
|L1.1200|
0004b0 0000fffe DCD 0x0000fffe
|L1.1204|
0004b4 4f2f4375 DCB "uC/O"
0004b8 49492d53 DCB "S-II"
0004bc 61745320 DCB " Sta"
0004c0 00000074 DCB "t\0\0\0"
|L1.1220|
0004c4 00000009 DCD ||.data|| + 9
ENDP
OSVersion PROC
;;;599 {
;;;600 return (OS_VERSION);
0004c8 e3a00f46 MOV r0,#0x118
;;;601 }
0004cc e12fff1e BX lr
ENDP
OS_MemCopy PROC
;;;1147 {
;;;1148 while (size > 0) {
|L1.1232|
0004d0 e3520000 CMP r2,#0
;;;1149 *pdest++ = *psrc++;
0004d4 14d13001 LDRBNE r3,[r1],#1
;;;1150 size--;
0004d8 12422001 SUBNE r2,r2,#1
0004dc 11a02802 LSLNE r2,r2,#16
0004e0 11a02822 LSRNE r2,r2,#16
0004e4 14c03001 STRBNE r3,[r0],#1 ;1149
0004e8 1afffff8 BNE |L1.1232|
;;;1151 }
;;;1152 }
0004ec e12fff1e BX lr
ENDP
OS_Sched PROC
;;;1171 void OS_Sched (void)
;;;1172 {
0004f0 e92d4070 PUSH {r4-r6,lr}
;;;1173 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1174 OS_CPU_SR cpu_sr = 0;
;;;1175 #endif
;;;1176
;;;1177
;;;1178
;;;1179 OS_ENTER_CRITICAL();
0004f4 ebfffffe BL OS_CPU_SR_Save
;;;1180 if (OSIntNesting == 0) { /* Schedule only if all ISRs done and ... */
0004f8 e51f4074 LDR r4,|L1.1164|
0004fc e1a05000 MOV r5,r0 ;1179
000500 e5d40002 LDRB r0,[r4,#2] ; OSIntNesting
000504 e3500000 CMP r0,#0
;;;1181 if (OSLockNesting == 0) { /* ... scheduler is not locked */
000508 05d40003 LDRBEQ r0,[r4,#3] ; OSLockNesting
00050c 03500000 CMPEQ r0,#0
000510 1a00000e BNE |L1.1360| ;1180
;;;1182 OS_SchedNew();
000514 ebfffffe BL OS_SchedNew
;;;1183 if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
000518 e5d41005 LDRB r1,[r4,#5] ; OSPrioHighRdy
00051c e5d40004 LDRB r0,[r4,#4] ; OSPrioCur
000520 e1510000 CMP r1,r0
000524 0a000009 BEQ |L1.1360|
;;;1184 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
000528 e51f00a8 LDR r0,|L1.1160|
00052c e7901101 LDR r1,[r0,r1,LSL #2]
;;;1185 #if OS_TASK_PROFILE_EN > 0
;;;1186 OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
000530 e5841024 STR r1,[r4,#0x24] ; OSTCBHighRdy
000534 e5910028 LDR r0,[r1,#0x28]
000538 e2800001 ADD r0,r0,#1
;;;1187 #endif
;;;1188 OSCtxSwCtr++; /* Increment context switch counter */
00053c e5810028 STR r0,[r1,#0x28]
000540 e594000c LDR r0,[r4,#0xc] ; OSCtxSwCtr
000544 e2800001 ADD r0,r0,#1
000548 e584000c STR r0,[r4,#0xc] ; OSCtxSwCtr
;;;1189 OS_TASK_SW(); /* Perform a context switch */
00054c ebfffffe BL OSCtxSw
;;;1190 }
;;;1191 }
;;;1192 }
;;;1193 OS_EXIT_CRITICAL();
|L1.1360|
000550 e1a00005 MOV r0,r5
000554 e8bd4070 POP {r4-r6,lr}
000558 eafffffe B OS_CPU_SR_Restore
;;;1194 }
ENDP
OS_StrCopy PROC
;;;1265
;;;1266 len = 0;
00055c e3a02000 MOV r2,#0
;;;1267 while (*psrc != OS_ASCII_NUL) {
|L1.1376|
000560 e5d13000 LDRB r3,[r1,#0]
000564 e3530000 CMP r3,#0
;;;1268 *pdest++ = *psrc++;
;;;1269 len++;
000568 12822001 ADDNE r2,r2,#1
00056c 12811001 ADDNE r1,r1,#1 ;1268
000570 120220ff ANDNE r2,r2,#0xff
000574 14c03001 STRBNE r3,[r0],#1 ;1268
000578 1afffff8 BNE |L1.1376|
;;;1270 }
;;;1271 *pdest = OS_ASCII_NUL;
00057c e3a01000 MOV r1,#0
000580 e5c01000 STRB r1,[r0,#0]
;;;1272 return (len);
000584 e1a00002 MOV r0,r2
;;;1273 }
000588 e12fff1e BX lr
ENDP
OS_StrLen PROC
;;;1297
;;;1298 len = 0;
00058c e3a01000 MOV r1,#0
;;;1299 while (*psrc != OS_ASCII_NUL) {
|L1.1424|
000590 e5d02000 LDRB r2,[r0,#0]
000594 e3520000 CMP r2,#0
;;;1300 psrc++;
;;;1301 len++;
000598 12811001 ADDNE r1,r1,#1
00059c 12800001 ADDNE r0,r0,#1 ;1300
0005a0 120110ff ANDNE r1,r1,#0xff
0005a4 1afffff9 BNE |L1.1424|
;;;1302 }
;;;1303 return (len);
0005a8 e1a00001 MOV r0,r1
;;;1304 }
0005ac e12fff1e BX lr
ENDP
OS_TCBInit PROC
;;;1497 INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
;;;1498 {
0005b0 e92d5fff PUSH {r0-r12,lr}
0005b4 e28db038 ADD r11,sp,#0x38
0005b8 e89b0e00 LDM r11,{r9-r11}
0005bc e1a06000 MOV r6,r0
0005c0 e1a05001 MOV r5,r1
0005c4 e1a08002 MOV r8,r2
;;;1499 OS_TCB *ptcb;
;;;1500 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1501 OS_CPU_SR cpu_sr = 0;
;;;1502 #endif
;;;1503
;;;1504
;;;1505
;;;1506 OS_ENTER_CRITICAL();
0005c8 ebfffffe BL OS_CPU_SR_Save
;;;1507 ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
0005cc e51f7148 LDR r7,|L1.1164|
0005d0 e5974020 LDR r4,[r7,#0x20] ; OSTCBFreeList
;;;1508 if (ptcb != (OS_TCB *)0) {
0005d4 e3540000 CMP r4,#0
0005d8 0a00003e BEQ |L1.1752|
;;;1509 OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
0005dc e5941014 LDR r1,[r4,#0x14]
0005e0 e5871020 STR r1,[r7,#0x20] ; OSTCBFreeList
;;;1510 OS_EXIT_CRITICAL();
0005e4 ebfffffe BL OS_CPU_SR_Restore
;;;1511 ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
0005e8 e5845000 STR r5,[r4,#0]
;;;1512 ptcb->OSTCBPrio = prio; /* Load task priority into TCB */
;;;1513 ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
0005ec e3a05000 MOV r5,#0
0005f0 e5c46020 STRB r6,[r4,#0x20] ;1512
0005f4 e5c4501e STRB r5,[r4,#0x1e]
;;;1514 ptcb->OSTCBPendTO = FALSE; /* Clear the Pend timeout flag */
0005f8 e5c4501f STRB r5,[r4,#0x1f]
;;;1515 ptcb->OSTCBDly = 0; /* Task is not delayed */
;;;1516
;;;1517 #if OS_TASK_CREATE_EXT_EN > 0
;;;1518 ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */
;;;1519 ptcb->OSTCBStkSize = stk_size; /* Store stack size */
;;;1520 ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */
0005fc e2840008 ADD r0,r4,#8
000600 e1c451bc STRH r5,[r4,#0x1c] ;1515
000604 e8800300 STM r0,{r8,r9}
000608 e584a004 STR r10,[r4,#4]
;;;1521 ptcb->OSTCBOpt = opt; /* Store task options */
00060c e1c4b1b0 STRH r11,[r4,#0x10]
;;;1522 ptcb->OSTCBId = id; /* Store task ID */
000610 e59d000c LDR r0,[sp,#0xc]
;;;1523 #else
;;;1524 pext = pext; /* Prevent compiler warning if not used */
;;;1525 stk_size = stk_size;
;;;1526 pbos = pbos;
;;;1527 opt = opt;
;;;1528 id = id;
;;;1529 #endif
;;;1530
;;;1531 #if OS_TASK_DEL_EN > 0
;;;1532 ptcb->OSTCBDelReq = OS_NO_ERR;
;;;1533 #endif
;;;1534
;;;1535 #if OS_LOWEST_PRIO <= 63
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -