33 #define MICRIUM_SOURCE
36 #ifdef VSC_INCLUDE_SOURCE_FILE_NAMES
37 const CPU_CHAR *os_stat__c =
"$Id: $";
41 #if OS_CFG_STAT_TASK_EN > 0u
57 void OSStatReset (
OS_ERR *p_err)
59 #if (OS_CFG_DBG_EN > 0u)
64 #if (OS_CFG_Q_EN > 0u)
72 #ifdef OS_SAFETY_CRITICAL
73 if (p_err == (
OS_ERR *)0) {
74 OS_SAFETY_CRITICAL_EXCEPTION();
80 #if OS_CFG_ISR_POST_DEFERRED_EN > 0u
81 OSIntQTaskTimeMax = (
CPU_TS )0;
85 #if OS_CFG_STAT_TASK_EN > 0u
86 OSStatTaskCPUUsageMax = 0u;
87 OSStatTaskTimeMax = (
CPU_TS)0;
92 #if OS_CFG_TMR_EN > 0u
93 OSTmrTaskTimeMax = (
CPU_TS)0;
96 #ifdef CPU_CFG_INT_DIS_MEAS_EN
97 OSIntDisTimeMax = (
CPU_TS)0;
100 #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
101 OSSchedLockTimeMax = (
CPU_TS)0;
105 OSMsgPool.NbrUsedMax = 0;
109 #if OS_CFG_DBG_EN > 0u
111 p_tcb = OSTaskDbgListPtr;
113 while (p_tcb != (OS_TCB *)0) {
116 #ifdef CPU_CFG_INT_DIS_MEAS_EN
117 p_tcb->IntDisTimeMax = (
CPU_TS )0;
120 #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
121 p_tcb->SchedLockTimeMax = (
CPU_TS )0;
124 #if OS_CFG_TASK_PROFILE_EN > 0u
125 #if OS_CFG_TASK_Q_EN > 0u
126 p_tcb->MsgQPendTimeMax = (
CPU_TS )0;
128 p_tcb->SemPendTimeMax = (
CPU_TS )0;
129 p_tcb->CtxSwCtr = (
OS_CTR )0;
137 #if OS_CFG_TASK_Q_EN > 0u
138 p_msg_q = &p_tcb->MsgQ;
141 p_tcb = p_tcb->DbgNextPtr;
146 #if (OS_CFG_Q_EN > 0u) && (OS_CFG_DBG_EN > 0u)
150 while (p_q != (OS_Q *)0) {
152 p_msg_q = &p_q->MsgQ;
154 p_q = p_q->DbgNextPtr;
161 #if OS_CFG_TMR_EN > 0u
191 void OSStatTaskCPUUsageInit (
OS_ERR *p_err)
199 #ifdef OS_SAFETY_CRITICAL
200 if (p_err == (
OS_ERR *)0) {
201 OS_SAFETY_CRITICAL_EXCEPTION();
206 #if (OS_CFG_TMR_EN > 0u)
207 OSTaskSuspend(&OSTmrTaskTCB, &err);
237 #if (OS_CFG_TMR_EN > 0u)
238 OSTaskResume(&OSTmrTaskTCB, &err);
246 OSStatTaskTimeMax = (
CPU_TS)0;
248 OSStatTaskCtrMax = OSStatTaskCtr;
281 void OS_StatTask (
void *p_arg)
283 #if OS_CFG_DBG_EN > 0u
284 #if OS_CFG_TASK_PROFILE_EN > 0u
322 #ifdef CPU_CFG_INT_DIS_MEAS_EN
323 OSIntDisTimeMax = CPU_IntDisMeasMaxGet();
327 OSStatTaskCtrRun = OSStatTaskCtr;
331 if (OSStatTaskCtrMax > OSStatTaskCtrRun) {
332 if (OSStatTaskCtrMax < 400000u) {
335 }
else if (OSStatTaskCtrMax < 4000000u) {
338 }
else if (OSStatTaskCtrMax < 40000000u) {
341 }
else if (OSStatTaskCtrMax < 400000000u) {
348 ctr_max = OSStatTaskCtrMax / ctr_div;
349 OSStatTaskCPUUsage = (
OS_CPU_USAGE)((
OS_TICK)10000u - ctr_mult * OSStatTaskCtrRun / ctr_max);
350 if (OSStatTaskCPUUsageMax < OSStatTaskCPUUsage) {
351 OSStatTaskCPUUsageMax = OSStatTaskCPUUsage;
360 #if OS_CFG_DBG_EN > 0u
361 #if OS_CFG_TASK_PROFILE_EN > 0u
365 p_tcb = OSTaskDbgListPtr;
367 while (p_tcb != (OS_TCB *)0) {
369 p_tcb->CyclesTotalPrev = p_tcb->CyclesTotal;
373 cycles_total += p_tcb->CyclesTotalPrev;
376 p_tcb = p_tcb->DbgNextPtr;
382 #if OS_CFG_TASK_PROFILE_EN > 0u
385 if (cycles_total < 400000u) {
386 cycles_mult = 10000u;
388 }
else if (cycles_total < 4000000u) {
391 }
else if (cycles_total < 40000000u) {
394 }
else if (cycles_total < 400000000u) {
401 cycles_max = cycles_total / cycles_div;
408 p_tcb = OSTaskDbgListPtr;
410 while (p_tcb != (OS_TCB *)0) {
411 #if OS_CFG_TASK_PROFILE_EN > 0u
412 usage = (
OS_CPU_USAGE)(cycles_mult * p_tcb->CyclesTotalPrev / cycles_max);
413 if (usage > 10000u) {
416 p_tcb->CPUUsage = usage;
417 if (p_tcb->CPUUsageMax < usage) {
418 p_tcb->CPUUsageMax = usage;
422 #if OS_CFG_STAT_TASK_STK_CHK_EN > 0u
430 p_tcb = p_tcb->DbgNextPtr;
441 if (OSStatTaskTimeMax < ts_end) {
442 OSStatTaskTimeMax = ts_end;
474 #ifdef OS_SAFETY_CRITICAL
475 if (p_err == (
OS_ERR *)0) {
476 OS_SAFETY_CRITICAL_EXCEPTION();
504 (
CPU_CHAR *)((
void *)
"uC/OS-III Stat Task"),