/***************************************************************************** * 函 数 名 : 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 ; }
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 ; }