/*****************************************************************************
* 函 数 名  : bsp_trace
*
* 功能描述  : 底软打印输出处理接口
*
* 输入参数  :  mod_id: 输出模块
*                           print_level: 打印级别
*                           fmt :打印输入参数
*
* 输出参数  : 无
*
* 返 回 值  : 无
*****************************************************************************/
void bsp_trace(bsp_log_level_e log_level, bsp_module_e mod_id,char *fmt,...)
{
    va_list arglist;
    s32 _args[6];
    s32 i;
    int flag;
	/* add time sample yangzhi 8-16 B:*/
    unsigned long time_cur =0;
    int sprint_len = 0;
    int fmt_len = 0;
    int buf_back_len = 0;
    char  buf_trans_temp[BSP_TRACE_BUF_LEN_MAX+1] = {0};
    char* ptr_log_msg = NULL;
	/* add time sample yangzhi 8-16 E!*/
	
    if(mod_id >= BSP_MODU_MAX )
    {
        return ;
    }

    if(g_mod_peint_level_info[mod_id].print_level > log_level )
    {
        return ;
    }
	
	/* add time sample yangzhi 8-16 B:*/
	/*lint -save -e530*/
    if(FALSE == log_init_flag)
    {
        g_log_buf_ctrl.buf_offset= 0;
        memset(log_buf_temp,0,BSP_LOG_BUF_LEN);
        g_log_buf_ctrl.write_ptr = log_buf_temp;
        log_init_flag = TRUE;
    }
    time_cur = bsp_get_slice_value();
    sprint_len = snprintf(buf_trans_temp,BSP_TRACE_BUF_LEN_MAX,"[%08x(dec:%ul)]",time_cur,time_cur);
    if(sprint_len > BSP_TRACE_BUF_LEN_MAX)
    {
        return ;
    }
    va_start(arglist, fmt);
    /*lint -restore +e530*/
    for(i = 0; i < 6; i++)
    {
        _args[i] = va_arg(arglist, s32);
    }
    va_end(arglist);
    /*lint -save -e732*/

    fmt_len = snprintf(buf_trans_temp+sprint_len,(int)(BSP_TRACE_BUF_LEN_MAX - sprint_len),fmt,_args[0],_args[1],\
        _args[2],_args[3],_args[4],_args[5]);/* [false alarm]:fortify */
    if(sprint_len > BSP_TRACE_BUF_LEN_MAX)
    {
        /* coverity[dead_error_line] */
        return ;
    }
    /*lint -restore*/
    fmt_len = fmt_len +sprint_len;
	buf_trans_temp[fmt_len +1] = '\0';
    fmt_len +=1;
    flag = intLock();
     /* 如果当前处于锁中断或者是中断上下文*/
     /*lint -save -e732*/
    if(VXWORKS_INT_LOCK_FLAG&flag)
    {
        printksync((char*)buf_trans_temp,0,0,0,0,0,0);
    }
    else
    {
        if(NULL != g_log_buf_ctrl.write_ptr)
        {
            ptr_log_msg = g_log_buf_ctrl.write_ptr;
            
			/* if tail of the buffer*/
            if((g_log_buf_ctrl.buf_offset + fmt_len)>= BSP_LOG_BUF_LEN)
            {
                buf_back_len = BSP_LOG_BUF_LEN-g_log_buf_ctrl.buf_offset;
                /* coverity[overrun-buffer-arg] */
                memcpy(g_log_buf_ctrl.write_ptr, buf_trans_temp, buf_back_len);
                
                /* set to head of buffer */
                g_log_buf_ctrl.write_ptr = log_buf_temp;
                /* coverity[overrun-buffer-arg] */
                memcpy(g_log_buf_ctrl.write_ptr, buf_trans_temp+buf_back_len, (fmt_len - buf_back_len));
                buf_back_len = fmt_len - buf_back_len;
                g_log_buf_ctrl.buf_offset= buf_back_len;
                g_log_buf_ctrl.write_ptr +=buf_back_len;
            }
            else
            {
                memcpy(g_log_buf_ctrl.write_ptr,buf_trans_temp,fmt_len);
                g_log_buf_ctrl.write_ptr +=fmt_len;
                g_log_buf_ctrl.buf_offset += fmt_len; 
            }
            logMsg(ptr_log_msg, 0,0,0,0,0,0); 
        }
        else
        {
            logMsg((char*)buf_trans_temp, 0,0,0,0,0,0);
        }
    }
    /* add time sample yangzhi 8-16 E!*/
	
    intUnlock(flag);

    return ;
}
Пример #2
0
void bsp_trace(bsp_log_level_e log_level, bsp_module_e mod_id,char *fmt,...)
{
    int ret_len;
    u8 *log_buf = NULL;
    va_list arglist;
    s32 _args[6];
    s32 i;
    int flag;

    if(mod_id >= BSP_MODU_MAX )
    {
        return ;
    }

    if(g_mod_peint_level_info[mod_id].print_level > log_level )
    {
        return ;
    }

    /* 根据NV项的配置选择打印输出方式*/
    if( BSP_LOG_SEND_TO_SHELL == g_om_global_info.om_cfg.nv_cfg.log_switch)
    {
        /*lint -save -e530*/
        va_start(arglist, fmt);
        /*lint -restore +e530*/
        for(i = 0; i < 6; i++)
        {
            _args[i] = va_arg(arglist, s32);
        }
        va_end(arglist);

        flag = intLock();
         /* 如果当前处于锁中断或者是中断上下文*/
        if(VXWORKS_INT_LOCK_FLAG&flag)
        {
            printksync((char*)fmt, _args[0], _args[1],_args[2],_args[3],_args[4],_args[5]);
        }
        else
        {
            logMsg((char*)fmt, _args[0], _args[1],_args[2],_args[3],_args[4],_args[5]);
        }

        intUnlock(flag);
    }
    else if(( BSP_LOG_SEND_TO_HSO == g_om_global_info.om_cfg.nv_cfg.log_switch)
                &&( TRUE== bsp_om_get_hso_conn_flag()))
    {
         /* 默认bsp trace 都往串口打印,可以通过NV项控制*/
        if(g_dump_cfg.dump_cfg.Bits.log_ctrl == 0)
        {
            va_start(arglist, fmt);
            for(i = 0; i < 6; i++)
            {
            _args[i] = va_arg(arglist, s32);
            }
            va_end(arglist);

            flag = intLock();

            /* 如果当前处于锁中断或者是中断上下文*/
            if(VXWORKS_INT_LOCK_FLAG&flag)
            {
                printksync((char*)fmt, _args[0], _args[1],_args[2],_args[3],_args[4],_args[5]);
            }
            else
            {
                logMsg((char*)fmt, _args[0], _args[1],_args[2],_args[3],_args[4],_args[5]);
            }

            intUnlock(flag);
        }
        ret_len = BSP_PRINT_BUF_LEN;

        log_buf = (u8*)bsp_om_get_log_buf((u32)ret_len);

        if(NULL == log_buf)
        {
            g_get_buf_fail++;
            return;
        }

         /*兼容PS上报格式*/
        va_start(arglist, fmt);
        /*lint -save -e119*/
        vsnprintf((char *)(log_buf+sizeof(bsp_trace_s)+1), BSP_PRINT_BUF_LEN -sizeof(bsp_trace_s)-1, fmt, arglist); /* [false alarm]:屏蔽Fority错误 */
         /*lint -restore*/
        va_end(arglist);

        bsp_log_header_packet(mod_id,log_level,log_buf,(u32)ret_len);

        /* send data to socp src chan.
           don't do this if interrupt is locked, because semGive will reschedule task and unlock interrupt. */
        flag = intLock();
        if(!(VXWORKS_INT_LOCK_FLAG&flag))
        {
            osl_sem_up(&send_task_sem);
        }
        intUnlock(flag);
    }
    else if(( BSP_LOG_SEND_TO_HSO == g_om_global_info.om_cfg.nv_cfg.log_switch)
                &&( TRUE != g_om_global_info.hso_connect_flag))
    {
         va_start(arglist, fmt);
        for(i = 0; i < 6; i++)
        {
            _args[i] = va_arg(arglist, s32);
        }
        va_end(arglist);
        flag = intLock();
         /* 如果当前处于锁中断或者是中断上下文*/
        if(VXWORKS_INT_LOCK_FLAG&flag)
        {

            printksync((char*)fmt, _args[0], _args[1],_args[2],_args[3],_args[4],_args[5]);
        }
        else
        {
            logMsg((char*)fmt, _args[0], _args[1],_args[2],_args[3],_args[4],_args[5]);
        }

        intUnlock(flag);
    }
    else
    {

    }

    return ;
}