void cpu_task_swt_hook(void *old_tcb, void *new_tcb) { u32 current_slice; u32 interval_slice; int suffix; struct task_struct *pTid; /* get current time */ current_slice = om_timer_get(); /* timer expire */ if (old_slice > current_slice) { interval_slice = (TIMER_MAX_VALUE - old_slice) + current_slice; } else { interval_slice = current_slice - old_slice; } /* sub interrupt's time */ pTid = ( struct task_struct *)old_tcb; suffix = pTid->suffix; if((suffix >= 0)&&(suffix < BSP_OM_MAX_TASK_NUM)) { /* Max slice */ if( g_om_cpu_trace[suffix].max_slice< interval_slice ) { g_om_cpu_trace[suffix].max_slice = interval_slice; } /* Min slice */ if( g_om_cpu_trace[suffix].min_slice> interval_slice ) { g_om_cpu_trace[suffix].min_slice = interval_slice; } g_om_cpu_trace[suffix].slices += interval_slice; g_om_cpu_trace[suffix].SwitchNum ++; } /* get the time that a new task begin to run */ old_slice = current_slice; }
void cpu_view_report_init(void) { struct task_struct *tempPtr; u32 startslice = 0; int task_num = 0x00; struct task_struct *pTid; for_each_process(pTid) { if(task_num >= BSP_OM_MAX_TASK_NUM) { break; } kernel_tid_list[task_num]= (int)pTid; tempPtr = (struct task_struct *)((u32)kernel_tid_list[task_num]); tempPtr->suffix = task_num; strncpy((char *)g_om_cpu_trace[task_num].task_name, (const char *)tempPtr->comm, BSP_SYSVIEW_TASK_NAME_LEN); g_om_cpu_trace[task_num].slices = 0; g_om_cpu_trace[task_num].max_slice = 0; g_om_cpu_trace[task_num].min_slice = 0xffffffff; task_num++; } g_task_num = (u32)task_num; if (0 == g_task_num) { return; } /*Init Task/interrupt Switch Hook*/ if ( ERROR == task_switch_hook_add( (FUNC_VOID)cpu_task_swt_hook ) ) { printk("CPU_utilization_Init fail.\r\n"); return; } startslice = om_timer_get(); old_slice = startslice; cpu_state = 1; return; }
void cpu_task_swt_hook(WIND_TCB *pOldTcb, WIND_TCB *pNewTcb) { u32 current_slice; u32 interval_slice; int suffix; /* get current time */ current_slice = om_timer_get(); /* timer expire */ if (old_slice > current_slice) { interval_slice = (TIMER_MAX_VALUE - old_slice) + current_slice; } else { interval_slice = current_slice - old_slice; } /* sub interrupt's time */ suffix = pOldTcb->spare4; if((suffix >= 0)&&(suffix < BSP_OM_MAX_TASK_NUM)) { /* Max slice */ if( g_om_cpu_trace[suffix].max_slice< interval_slice ) { g_om_cpu_trace[suffix].max_slice = interval_slice; } /* Min slice */ if( g_om_cpu_trace[suffix].min_slice> interval_slice ) { g_om_cpu_trace[suffix].min_slice = interval_slice; } g_om_cpu_trace[suffix].slices += interval_slice; g_om_cpu_trace[suffix].SwitchNum ++; } /* clear interrupt's time when a new task run */ /* get the time that a new task begin to run */ old_slice = current_slice; }
u32 cpu_utilization_start() { u32 i; if (1 != cpu_state) { return 0xffffffff; } cmd_start_slice = om_timer_get(); for ( i=0; i<BSP_OM_MAX_TASK_NUM; i++ ) { g_om_cpu_trace[i].cmdslice = g_om_cpu_trace[i].slices; g_om_cpu_trace[i].SwitchNum = 0; } return BSP_OK; }
void cpu_view_report_init(void) { u32 i; WIND_TCB *tempPtr; u32 startslice = 0; /*establish map between task and stat info */ g_task_num = (u32)taskIdListGet( vxworks_tid_list, BSP_OM_MAX_TASK_NUM ); if (0 == g_task_num) { return; } for ( i=0; i<g_task_num; i++ ) { tempPtr = (WIND_TCB *)((u32)vxworks_tid_list[i]); tempPtr->spare4 = (int)i; strncpy((char *)g_om_cpu_trace[i].task_name, (const char *)taskName(vxworks_tid_list[i]), BSP_SYSVIEW_TASK_NAME_LEN); g_om_cpu_trace[i].slices = 0; g_om_cpu_trace[i].max_slice = 0; g_om_cpu_trace[i].min_slice = 0xffffffff; } /*Init Task/interrupt Switch Hook*/ if ( ERROR == taskSwitchHookAdd( (FUNCPTR)cpu_task_swt_hook ) ) { printf("CPU_utilization_Init fail.\r\n"); return; } startslice = om_timer_get(); old_slice = startslice; cpu_state = 1; return; }
u32 omTimerGet(void) { return om_timer_get(); }
unsigned int omTimerGet(void) { return om_timer_get(); }