📄 os_core.txt
字号:
000210 e1a00008 MOV r0,r8
000214 ebfffffe BL OS_CPU_SR_Restore
000218 e3a00000 MOV r0,#0
00021c e5c60000 STRB r0,[r6,#0]
000220 eaffffcb B |L1.340|
ENDP
OS_TaskStatStkChk PROC
;;;1462 void OS_TaskStatStkChk (void)
;;;1463 {
000224 e92d407c PUSH {r2-r6,lr}
;;;1464 OS_TCB *ptcb;
;;;1465 OS_STK_DATA stk_data;
;;;1466 INT8U err;
;;;1467 INT8U prio;
;;;1468
;;;1469
;;;1470 for (prio = 0; prio <= OS_TASK_IDLE_PRIO; prio++) {
000228 e3a06000 MOV r6,#0
00022c ea000013 B |L1.640|
|L1.560|
;;;1471 err = OSTaskStkChk(prio, &stk_data);
000230 e28d1000 ADD r1,sp,#0
000234 e1a00006 MOV r0,r6
000238 ebfffffe BL OSTaskStkChk
00023c e1a05000 MOV r5,r0
;;;1472 if (err == OS_ERR_NONE) {
000240 e3550000 CMP r5,#0
000244 1a00000b BNE |L1.632|
;;;1473 ptcb = OSTCBPrioTbl[prio];
000248 e59f0340 LDR r0,|L1.1424|
00024c e7904106 LDR r4,[r0,r6,LSL #2]
;;;1474 if (ptcb != (OS_TCB *)0) { /* Make sure task 'ptcb' is ... */
000250 e3540000 CMP r4,#0
000254 0a000007 BEQ |L1.632|
;;;1475 if (ptcb != (OS_TCB *)1) { /* ... still valid. */
000258 e3540001 CMP r4,#1
00025c 0a000005 BEQ |L1.632|
;;;1476 #if OS_TASK_PROFILE_EN > 0
;;;1477 #if OS_STK_GROWTH == 1
;;;1478 ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom + ptcb->OSTCBStkSize;
000260 e2841008 ADD r1,r4,#8
000264 e8910003 LDM r1,{r0,r1}
000268 e0800101 ADD r0,r0,r1,LSL #2
00026c e5840040 STR r0,[r4,#0x40]
;;;1479 #else
;;;1480 ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom - ptcb->OSTCBStkSize;
;;;1481 #endif
;;;1482 ptcb->OSTCBStkUsed = stk_data.OSUsed; /* Store the number of bytes used */
000270 e59d0004 LDR r0,[sp,#4]
000274 e5840044 STR r0,[r4,#0x44]
|L1.632|
000278 e2860001 ADD r0,r6,#1
00027c e20060ff AND r6,r0,#0xff
|L1.640|
000280 e356001f CMP r6,#0x1f
000284 daffffe9 BLE |L1.560|
;;;1483 #endif
;;;1484 }
;;;1485 }
;;;1486 }
;;;1487 }
;;;1488 }
000288 e8bd407c POP {r2-r6,lr}
00028c e12fff1e BX lr
ENDP
OS_TaskStat PROC
;;;1407 void OS_TaskStat (void *p_arg)
;;;1408 {
000290 e92d41f0 PUSH {r4-r8,lr}
;;;1409 INT32U run;
;;;1410 INT32U max;
;;;1411 INT8S usage;
;;;1412 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1413 OS_CPU_SR cpu_sr = 0;
000294 e3a07000 MOV r7,#0
;;;1414 #endif
;;;1415
;;;1416
;;;1417
;;;1418 p_arg = p_arg; /* Prevent compiler warning for not using 'parg' */
000298 e1a00000 MOV r0,r0
;;;1419 while (OSStatRdy == OS_FALSE) {
00029c ea000001 B |L1.680|
|L1.672|
;;;1420 OSTimeDly(2 * OS_TICKS_PER_SEC / 10); /* Wait until statistic task is ready */
0002a0 e3a000c8 MOV r0,#0xc8
0002a4 ebfffffe BL OSTimeDly
|L1.680|
0002a8 e59f02e4 LDR r0,|L1.1428|
0002ac e5d00000 LDRB r0,[r0,#0] ; OSStatRdy
0002b0 e3500000 CMP r0,#0
0002b4 0afffff9 BEQ |L1.672|
;;;1421 }
;;;1422 max = OSIdleCtrMax / 100L;
0002b8 e3a01064 MOV r1,#0x64
0002bc e59f02d4 LDR r0,|L1.1432|
0002c0 e5900000 LDR r0,[r0,#0] ; OSIdleCtrMax
0002c4 ebfffffe BL __aeabi_uidivmod
0002c8 e1a05000 MOV r5,r0
;;;1423 for (;;) {
0002cc e1a00000 MOV r0,r0
|L1.720|
;;;1424 OS_ENTER_CRITICAL();
0002d0 ebfffffe BL OS_CPU_SR_Save
0002d4 e1a07000 MOV r7,r0
;;;1425 OSIdleCtrRun = OSIdleCtr; /* Obtain the of the idle counter for the past second */
0002d8 e59f02bc LDR r0,|L1.1436|
0002dc e5900000 LDR r0,[r0,#0] ; OSIdleCtr
0002e0 e59f12b8 LDR r1,|L1.1440|
0002e4 e5810000 STR r0,[r1,#0] ; OSIdleCtrRun
;;;1426 run = OSIdleCtr;
0002e8 e59f02ac LDR r0,|L1.1436|
0002ec e5904000 LDR r4,[r0,#0] ; OSIdleCtr
;;;1427 OSIdleCtr = 0L; /* Reset the idle counter for the next second */
0002f0 e3a00000 MOV r0,#0
0002f4 e59f12a0 LDR r1,|L1.1436|
0002f8 e5810000 STR r0,[r1,#0] ; OSIdleCtr
;;;1428 OS_EXIT_CRITICAL();
0002fc e1a00007 MOV r0,r7
000300 ebfffffe BL OS_CPU_SR_Restore
;;;1429 if (max > 0L) {
000304 e3550000 CMP r5,#0
000308 0a00000e BEQ |L1.840|
;;;1430 usage = (INT8S)(100L - run / max);
00030c e1a01005 MOV r1,r5
000310 e1a00004 MOV r0,r4
000314 ebfffffe BL __aeabi_uidivmod
000318 e2600064 RSB r0,r0,#0x64
00031c e1a06c00 LSL r6,r0,#24
000320 e1a06c46 ASR r6,r6,#24
;;;1431 if (usage >= 0) { /* Make sure we don't have a negative percentage */
000324 e3560000 CMP r6,#0
000328 ba000002 BLT |L1.824|
;;;1432 OSCPUUsage = usage;
00032c e59f0270 LDR r0,|L1.1444|
000330 e5c06000 STRB r6,[r0,#0] ; OSCPUUsage
000334 ea00000b B |L1.872|
|L1.824|
;;;1433 } else {
;;;1434 OSCPUUsage = 0;
000338 e3a00000 MOV r0,#0
00033c e59f1260 LDR r1,|L1.1444|
000340 e5c10000 STRB r0,[r1,#0] ; OSCPUUsage
000344 ea000007 B |L1.872|
|L1.840|
;;;1435 }
;;;1436 } else {
;;;1437 OSCPUUsage = 0;
000348 e3a00000 MOV r0,#0
00034c e59f1250 LDR r1,|L1.1444|
000350 e5c10000 STRB r0,[r1,#0] ; OSCPUUsage
;;;1438 max = OSIdleCtrMax / 100L;
000354 e3a01064 MOV r1,#0x64
000358 e59f0238 LDR r0,|L1.1432|
00035c e5900000 LDR r0,[r0,#0] ; OSIdleCtrMax
000360 ebfffffe BL __aeabi_uidivmod
000364 e1a05000 MOV r5,r0
|L1.872|
;;;1439 }
;;;1440 OSTaskStatHook(); /* Invoke user definable hook */
000368 ebfffffe BL OSTaskStatHook
;;;1441 #if (OS_TASK_STAT_STK_CHK_EN > 0) && (OS_TASK_CREATE_EXT_EN > 0)
;;;1442 OS_TaskStatStkChk(); /* Check the stacks for each task */
00036c ebfffffe BL OS_TaskStatStkChk
;;;1443 #endif
;;;1444 OSTimeDly(OS_TICKS_PER_SEC / 10); /* Accumulate OSIdleCtr for the next 1/10 second */
000370 e3a00064 MOV r0,#0x64
000374 ebfffffe BL OSTimeDly
000378 eaffffd4 B |L1.720|
;;;1445 }
;;;1446 }
ENDP
OS_InitTaskStat PROC
;;;1036 static void OS_InitTaskStat (void)
;;;1037 {
00037c e52de004 PUSH {lr}
000380 e24dd01c SUB sp,sp,#0x1c
;;;1038 #if OS_TASK_NAME_SIZE > 7
;;;1039 INT8U err;
;;;1040 #endif
;;;1041
;;;1042
;;;1043 #if OS_TASK_CREATE_EXT_EN > 0
;;;1044 #if OS_STK_GROWTH == 1
;;;1045 (void)OSTaskCreateExt(OS_TaskStat,
000384 e3a03003 MOV r3,#3
000388 e3a02000 MOV r2,#0
00038c e3a01080 MOV r1,#0x80
000390 e59f0210 LDR r0,|L1.1448|
000394 e98d000f STMIB sp,{r0-r3}
000398 e59f320c LDR r3,|L1.1452|
00039c e58d3000 STR r3,[sp,#0]
0003a0 e3a0301e MOV r3,#0x1e
0003a4 e2802f7f ADD r2,r0,#0x1fc
0003a8 e3a01000 MOV r1,#0
0003ac e24f0f49 ADR r0,OS_TaskStat
0003b0 ebfffffe BL OSTaskCreateExt
;;;1046 (void *)0, /* No args passed to OS_TaskStat()*/
;;;1047 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Top-Of-Stack */
;;;1048 OS_TASK_STAT_PRIO, /* One higher than the idle task */
;;;1049 OS_TASK_STAT_ID,
;;;1050 &OSTaskStatStk[0], /* Set Bottom-Of-Stack */
;;;1051 OS_TASK_STAT_STK_SIZE,
;;;1052 (void *)0, /* No TCB extension */
;;;1053 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
;;;1054 #else
;;;1055 (void)OSTaskCreateExt(OS_TaskStat,
;;;1056 (void *)0, /* No args passed to OS_TaskStat()*/
;;;1057 &OSTaskStatStk[0], /* Set Top-Of-Stack */
;;;1058 OS_TASK_STAT_PRIO, /* One higher than the idle task */
;;;1059 OS_TASK_STAT_ID,
;;;1060 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Bottom-Of-Stack */
;;;1061 OS_TASK_STAT_STK_SIZE,
;;;1062 (void *)0, /* No TCB extension */
;;;1063 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
;;;1064 #endif
;;;1065 #else
;;;1066 #if OS_STK_GROWTH == 1
;;;1067 (void)OSTaskCreate(OS_TaskStat,
;;;1068 (void *)0, /* No args passed to OS_TaskStat()*/
;;;1069 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Top-Of-Stack */
;;;1070 OS_TASK_STAT_PRIO); /* One higher than the idle task */
;;;1071 #else
;;;1072 (void)OSTaskCreate(OS_TaskStat,
;;;1073 (void *)0, /* No args passed to OS_TaskStat()*/
;;;1074 &OSTaskStatStk[0], /* Set Top-Of-Stack */
;;;1075 OS_TASK_STAT_PRIO); /* One higher than the idle task */
;;;1076 #endif
;;;1077 #endif
;;;1078
;;;1079 #if OS_TASK_NAME_SIZE > 14
;;;1080 OSTaskNameSet(OS_TASK_STAT_PRIO, (INT8U *)"uC/OS-II Stat", &err);
0003b4 e28d2018 ADD r2,sp,#0x18
0003b8 e28f1e1f ADR r1,|L1.1456|
0003bc e3a0001e MOV r0,#0x1e
0003c0 ebfffffe BL OSTaskNameSet
;;;1081 #else
;;;1082 #if OS_TASK_NAME_SIZE > 7
;;;1083 OSTaskNameSet(OS_TASK_STAT_PRIO, (INT8U *)"OS-Stat", &err);
;;;1084 #endif
;;;1085 #endif
;;;1086 }
0003c4 e28dd01c ADD sp,sp,#0x1c
0003c8 e49de004 POP {lr}
0003cc e12fff1e BX lr
ENDP
OS_TaskIdle PROC
;;;1365 void OS_TaskIdle (void *p_arg)
;;;1366 {
0003d0 e92d4010 PUSH {r4,lr}
;;;1367 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1368 OS_CPU_SR cpu_sr = 0;
0003d4 e3a04000 MOV r4,#0
;;;1369 #endif
;;;1370
;;;1371
;;;1372
;;;1373 (void)p_arg; /* Prevent compiler warning for not using 'parg' */
;;;1374 for (;;) {
0003d8 e1a00000 MOV r0,r0
|L1.988|
;;;1375 OS_ENTER_CRITICAL();
0003dc ebfffffe BL OS_CPU_SR_Save
0003e0 e1a04000 MOV r4,r0
;;;1376 OSIdleCtr++;
0003e4 e59f01b0 LDR r0,|L1.1436|
0003e8 e5900000 LDR r0,[r0,#0] ; OSIdleCtr
0003ec e2800001 ADD r0,r0,#1
0003f0 e59f11a4 LDR r1,|L1.1436|
0003f4 e5810000 STR r0,[r1,#0] ; OSIdleCtr
;;;1377 OS_EXIT_CRITICAL();
0003f8 e1a00004 MOV r0,r4
0003fc ebfffffe BL OS_CPU_SR_Restore
;;;1378 OSTaskIdleHook(); /* Call user definable HOOK */
000400 ebfffffe BL OSTaskIdleHook
000404 eafffff4 B |L1.988|
;;;1379 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -