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();
}
Example #7
0
unsigned int omTimerGet(void)
{
    return om_timer_get();
}