📄 os_core.txt
字号:
;;;1467 OS_TCB *ptcb;
;;;1468 OS_STK_DATA stk_data;
;;;1469 INT8U err;
;;;1470 INT8U prio;
;;;1471
;;;1472
;;;1473 for (prio = 0; prio <= OS_TASK_IDLE_PRIO; prio++) {
000132 2400 MOVS r4,#0
000134 4dc5 LDR r5,|L1.1100|
|L1.310|
;;;1474 err = OSTaskStkChk(prio, &stk_data);
000136 a901 ADD r1,sp,#4
000138 4620 MOV r0,r4
00013a f7fff7ff BL OSTaskStkChk
;;;1475 if (err == OS_ERR_NONE) {
00013e b958 CBNZ r0,|L1.344|
;;;1476 ptcb = OSTCBPrioTbl[prio];
000140 f855f855 LDR r0,[r5,r4,LSL #2]
;;;1477 if (ptcb != (OS_TCB *)0) { /* Make sure task 'ptcb' is ... */
000144 b140 CBZ r0,|L1.344|
000146 2801 CMP r0,#1
;;;1478 if (ptcb != OS_TCB_RESERVED) { /* ... still valid. */
000148 d006 BEQ |L1.344|
00014a 68c2 LDR r2,[r0,#0xc]
00014c 6881 LDR r1,[r0,#8]
00014e eb01eb01 ADD r1,r1,r2,LSL #2
;;;1479 #if OS_TASK_PROFILE_EN > 0
;;;1480 #if OS_STK_GROWTH == 1
;;;1481 ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom + ptcb->OSTCBStkSize;
000152 6401 STR r1,[r0,#0x40]
000154 9902 LDR r1,[sp,#8]
;;;1482 #else
;;;1483 ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom - ptcb->OSTCBStkSize;
;;;1484 #endif
;;;1485 ptcb->OSTCBStkUsed = stk_data.OSUsed; /* Store the number of bytes used */
000156 6441 STR r1,[r0,#0x44]
|L1.344|
000158 1c60 ADDS r0,r4,#1
00015a b2c4 UXTB r4,r0
00015c 2c1f CMP r4,#0x1f
00015e d9ea BLS |L1.310|
;;;1486 #endif
;;;1487 }
;;;1488 }
;;;1489 }
;;;1490 }
;;;1491 }
000160 b003 ADD sp,sp,#0xc
000162 bd30 POP {r4,r5,pc}
;;;1492 #endif
ENDP
OS_TaskStat PROC
;;;1410 void OS_TaskStat (void *p_arg)
;;;1411 {
000164 e92de92d PUSH {r4-r8,lr}
;;;1412 INT32U run;
;;;1413 INT32U max;
;;;1414 INT8S usage;
;;;1415 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1416 OS_CPU_SR cpu_sr = 0;
;;;1417 #endif
;;;1418
;;;1419
;;;1420
;;;1421 p_arg = p_arg; /* Prevent compiler warning for not using 'parg' */
;;;1422 while (OSStatRdy == OS_FALSE) {
000168 4db7 LDR r5,|L1.1096|
00016a 7868 LDRB r0,[r5,#1] ; OSStatRdy
00016c b928 CBNZ r0,|L1.378|
|L1.366|
00016e 2014 MOVS r0,#0x14
000170 f7fff7ff BL OSTimeDly
000174 7868 LDRB r0,[r5,#1] ; OSStatRdy
000176 2800 CMP r0,#0
000178 d0f9 BEQ |L1.366|
|L1.378|
;;;1423 OSTimeDly(2 * OS_TICKS_PER_SEC / 10); /* Wait until statistic task is ready */
;;;1424 }
;;;1425 max = OSIdleCtrMax / 100L;
00017a 6968 LDR r0,[r5,#0x14] ; OSIdleCtrMax
00017c f04ff04f MOV r8,#0x64
000180 fbb0fbb0 UDIV r4,r0,r8
;;;1426 for (;;) {
000184 2700 MOVS r7,#0
|L1.390|
;;;1427 OS_ENTER_CRITICAL();
000186 f7fff7ff BL OS_CPU_SR_Save
;;;1428 OSIdleCtrRun = OSIdleCtr; /* Obtain the of the idle counter for the past second */
00018a 6a29 LDR r1,[r5,#0x20] ; OSIdleCtr
00018c 61a9 STR r1,[r5,#0x18] ; OSIdleCtrRun
;;;1429 run = OSIdleCtr;
00018e 6a2e LDR r6,[r5,#0x20] ; OSIdleCtr
;;;1430 OSIdleCtr = 0L; /* Reset the idle counter for the next second */
000190 622f STR r7,[r5,#0x20] ; OSIdleCtr
;;;1431 OS_EXIT_CRITICAL();
000192 f7fff7ff BL OS_CPU_SR_Restore
;;;1432 if (max > 0L) {
000196 b154 CBZ r4,|L1.430|
;;;1433 usage = (INT8S)(100L - run / max);
000198 fbb6fbb6 UDIV r0,r6,r4
00019c f1c0f1c0 RSB r0,r0,#0x64
0001a0 b240 SXTB r0,r0
;;;1434 if (usage >= 0) { /* Make sure we don't have a negative percentage */
0001a2 2800 CMP r0,#0
0001a4 db01 BLT |L1.426|
;;;1435 OSCPUUsage = usage;
0001a6 7028 STRB r0,[r5,#0] ; OSCPUUsage
0001a8 e005 B |L1.438|
|L1.426|
;;;1436 } else {
;;;1437 OSCPUUsage = 0;
0001aa 702f STRB r7,[r5,#0] ; OSCPUUsage
0001ac e003 B |L1.438|
|L1.430|
;;;1438 }
;;;1439 } else {
;;;1440 OSCPUUsage = 0;
0001ae 702f STRB r7,[r5,#0] ; OSCPUUsage
;;;1441 max = OSIdleCtrMax / 100L;
0001b0 6968 LDR r0,[r5,#0x14] ; OSIdleCtrMax
0001b2 fbb0fbb0 UDIV r4,r0,r8
|L1.438|
;;;1442 }
;;;1443 OSTaskStatHook(); /* Invoke user definable hook */
0001b6 f7fff7ff BL OSTaskStatHook
;;;1444 #if (OS_TASK_STAT_STK_CHK_EN > 0) && (OS_TASK_CREATE_EXT_EN > 0)
;;;1445 OS_TaskStatStkChk(); /* Check the stacks for each task */
0001ba f7fff7ff BL OS_TaskStatStkChk
;;;1446 #endif
;;;1447 OSTimeDly(OS_TICKS_PER_SEC / 10); /* Accumulate OSIdleCtr for the next 1/10 second */
0001be 200a MOVS r0,#0xa
0001c0 f7fff7ff BL OSTimeDly
0001c4 e7df B |L1.390|
;;;1448 }
;;;1449 }
;;;1450 #endif
ENDP
OS_InitTaskStat PROC
;;;1039 static void OS_InitTaskStat (void)
;;;1040 {
0001c6 b500 PUSH {lr}
0001c8 b087 SUB sp,sp,#0x1c
;;;1041 #if OS_TASK_NAME_SIZE > 7
;;;1042 INT8U err;
;;;1043 #endif
;;;1044
;;;1045
;;;1046 #if OS_TASK_CREATE_EXT_EN > 0
;;;1047 #if OS_STK_GROWTH == 1
;;;1048 (void)OSTaskCreateExt(OS_TaskStat,
0001ca 2303 MOVS r3,#3
0001cc 2200 MOVS r2,#0
0001ce e9cde9cd STRD r2,r3,[sp,#0xc]
0001d2 f64ff64f MOV r3,#0xfffe
0001d6 2180 MOVS r1,#0x80
0001d8 489d LDR r0,|L1.1104|
0001da 9300 STR r3,[sp,#0]
0001dc 9102 STR r1,[sp,#8]
0001de 231e MOVS r3,#0x1e
0001e0 9001 STR r0,[sp,#4]
0001e2 f500f500 ADD r2,r0,#0x1fc
0001e6 2100 MOVS r1,#0
0001e8 f2aff2af ADR r0,OS_TaskStat + 1
0001ec f7fff7ff BL OSTaskCreateExt
;;;1049 (void *)0, /* No args passed to OS_TaskStat()*/
;;;1050 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Top-Of-Stack */
;;;1051 OS_TASK_STAT_PRIO, /* One higher than the idle task */
;;;1052 OS_TASK_STAT_ID,
;;;1053 &OSTaskStatStk[0], /* Set Bottom-Of-Stack */
;;;1054 OS_TASK_STAT_STK_SIZE,
;;;1055 (void *)0, /* No TCB extension */
;;;1056 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
;;;1057 #else
;;;1058 (void)OSTaskCreateExt(OS_TaskStat,
;;;1059 (void *)0, /* No args passed to OS_TaskStat()*/
;;;1060 &OSTaskStatStk[0], /* Set Top-Of-Stack */
;;;1061 OS_TASK_STAT_PRIO, /* One higher than the idle task */
;;;1062 OS_TASK_STAT_ID,
;;;1063 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Bottom-Of-Stack */
;;;1064 OS_TASK_STAT_STK_SIZE,
;;;1065 (void *)0, /* No TCB extension */
;;;1066 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
;;;1067 #endif
;;;1068 #else
;;;1069 #if OS_STK_GROWTH == 1
;;;1070 (void)OSTaskCreate(OS_TaskStat,
;;;1071 (void *)0, /* No args passed to OS_TaskStat()*/
;;;1072 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Top-Of-Stack */
;;;1073 OS_TASK_STAT_PRIO); /* One higher than the idle task */
;;;1074 #else
;;;1075 (void)OSTaskCreate(OS_TaskStat,
;;;1076 (void *)0, /* No args passed to OS_TaskStat()*/
;;;1077 &OSTaskStatStk[0], /* Set Top-Of-Stack */
;;;1078 OS_TASK_STAT_PRIO); /* One higher than the idle task */
;;;1079 #endif
;;;1080 #endif
;;;1081
;;;1082 #if OS_TASK_NAME_SIZE > 14
;;;1083 OSTaskNameSet(OS_TASK_STAT_PRIO, (INT8U *)"uC/OS-II Stat", &err);
0001f0 aa06 ADD r2,sp,#0x18
0001f2 a198 ADR r1,|L1.1108|
0001f4 201e MOVS r0,#0x1e
0001f6 f7fff7ff BL OSTaskNameSet
;;;1084 #else
;;;1085 #if OS_TASK_NAME_SIZE > 7
;;;1086 OSTaskNameSet(OS_TASK_STAT_PRIO, (INT8U *)"OS-Stat", &err);
;;;1087 #endif
;;;1088 #endif
;;;1089 }
0001fa b007 ADD sp,sp,#0x1c
0001fc bd00 POP {pc}
;;;1090 #endif
ENDP
OS_TaskIdle PROC
;;;1368 void OS_TaskIdle (void *p_arg)
;;;1369 {
0001fe b510 PUSH {r4,lr}
000200 4c91 LDR r4,|L1.1096|
|L1.514|
;;;1370 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1371 OS_CPU_SR cpu_sr = 0;
;;;1372 #endif
;;;1373
;;;1374
;;;1375
;;;1376 (void)p_arg; /* Prevent compiler warning for not using 'parg' */
;;;1377 for (;;) {
;;;1378 OS_ENTER_CRITICAL();
000202 f7fff7ff BL OS_CPU_SR_Save
;;;1379 OSIdleCtr++;
000206 6a21 LDR r1,[r4,#0x20] ; OSIdleCtr
000208 1c49 ADDS r1,r1,#1
00020a 6221 STR r1,[r4,#0x20] ; OSIdleCtr
;;;1380 OS_EXIT_CRITICAL();
00020c f7fff7ff BL OS_CPU_SR_Restore
;;;1381 OSTaskIdleHook(); /* Call user definable HOOK */
000210 f7fff7ff BL OSTaskIdleHook
000214 e7f5 B |L1.514|
;;;1382 }
;;;1383 }
;;;1384 /*$PAGE*/
ENDP
OS_InitTaskIdle PROC
;;;973 static void OS_InitTaskIdle (void)
;;;974 {
000216 b500 PUSH {lr}
000218 b087 SUB sp,sp,#0x1c
;;;975 #if OS_TASK_NAME_SIZE > 7
;;;976 INT8U err;
;;;977 #endif
;;;978
;;;979
;;;980 #if OS_TASK_CREATE_EXT_EN > 0
;;;981 #if OS_STK_GROWTH == 1
;;;982 (void)OSTaskCreateExt(OS_TaskIdle,
00021a 2303 MOVS r3,#3
00021c 2200 MOVS r2,#0
00021e e9cde9cd STRD r2,r3,[sp,#0xc]
000222 f64ff64f MOV r3,#0xffff
000226 2180 MOVS r1,#0x80
000228 488e LDR r0,|L1.1124|
00022a 9300 STR r3,[sp,#0]
00022c 9102 STR r1,[sp,#8]
00022e 231f MOVS r3,#0x1f
000230 9001 STR r0,[sp,#4]
000232 f500f500 ADD r2,r0,#0x1fc
000236 2100 MOVS r1,#0
000238 f2aff2af ADR r0,OS_TaskIdle + 1
00023c f7fff7ff BL OSTaskCreateExt
;;;983 (void *)0, /* No arguments passed to OS_TaskIdle() */
;;;984 &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set Top-Of-Stack */
;;;985 OS_TASK_IDLE_PRIO, /* Lowest priority level */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -