pusart log

//串口log开关
#define AUDIO_DEBUG_LOG_ENABLE  1
#if AUDIO_DEBUG_LOG_ENABLE
#define AUDIO_LOG_DBG(format, ...)     LOG_RAW("BT_AUDIO: [%s] "format"\r\n", __func__, ##__VA_ARGS__)
#else
#define AUDIO_LOG_DBG(...)
#endif//存储log开关
#define AUDIO_SAVE_LOG_TO_EMMC   0
#if AUDIO_SAVE_LOG_TO_EMMC
#if AUDIO_DEBUG_LOG_ENABLE
#define AUDIO_SLOG_DBG(level, format, ...)  SLOG_DBG(level, "BT_AUD:"format"\r\n", ##__VA_ARGS__);LOG_RAW("BT_AUDIO: %s: "format"\r\n", __func__, ##__VA_ARGS__);
#define AUDIO_SLOG_ERR(level, format, ...)  SLOG_ERR(level, "BT_AUD:"format"\r\n", ##__VA_ARGS__);LOG_RAW("BT_AUDIO: %s: "format"\r\n", __func__, ##__VA_ARGS__);
#else
#define AUDIO_SLOG_DBG(level, format, ...)  SLOG_DBG(level, "BT_AUD:"format"\r\n", ##__VA_ARGS__)
#define AUDIO_SLOG_ERR(level, format, ...)  SLOG_ERR(level, "BT_AUD:"format"\r\n", ##__VA_ARGS__)
#endif
#else
#if AUDIO_DEBUG_LOG_ENABLE
#define AUDIO_SLOG_DBG(level, format, ...)  LOG_RAW("BT_AUDIO: %s: "format"\r\n", __func__, ##__VA_ARGS__);
#define AUDIO_SLOG_ERR(level, format, ...)  LOG_RAW("BT_AUDIO: %s: "format"\r\n", __func__, ##__VA_ARGS__);
#else
#define AUDIO_SLOG_DBG(level, ...)
#define AUDIO_SLOG_ERR(level, ...)
#endif
#endif
#ifdef GPS_OTA_TEST
#define DEBUG_QUEUEBUFFER_SIZE  8192
#else
#define DEBUG_QUEUEBUFFER_SIZE  4096
#endif
#define DEBUG_MSG_MAX_SIZE    1024
typedef struct
{uint32_t    MPU_Region[MPU_PROTECTED_REGION_SIZE];queue_t     DebugQueue;uint8_t     _DebugQueueBuffer[DEBUG_QUEUEBUFFER_SIZE];uint8_t     _tempMsgBuf[DEBUG_MSG_MAX_SIZE];
} Service_Debug_data_t;extern Service_Debug_data_t g_data_service_debug;
/*** @brief log数据打印接口* @param NONE* @retval NONE*/
void service_debug(const char *format, ...)
{if (g_log_switch){va_list arg_ptr;va_start(arg_ptr, format);service_debug_ext(format, arg_ptr);va_end(arg_ptr);}
}/*** @brief log数据打印实现* @param NONE* @retval NONE*/
void service_debug_ext(const char *format, va_list arg_ptr)
{uint16_t buf_size;uint32_t uwPRIMASK_Bit;uint8_t* buffer;SET_DEVICE_LOCK(D_LPUART_LOCK);uwPRIMASK_Bit = __get_PRIMASK();  /**< backup PRIMASK bit */__disable_irq();          /**< Disable all interrupts by setting PRIMASK bit on Cortex*/buf_size=vsnprintf((char *) g_data_service_debug._tempMsgBuf, DEBUG_MSG_MAX_SIZE, format, arg_ptr);buffer=CircularQueue_Add(&g_data_service_debug.DebugQueue,(uint8_t*)g_data_service_debug._tempMsgBuf, buf_size,1);if(buffer && debugUartReady){debugUartReady  = RESET;HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t*)buffer, buf_size);  //uart通过dma方式}__set_PRIMASK(uwPRIMASK_Bit);
}#define LOG_PRINTF      service_debug/****************************** log打印接口 ************************************/
#define LOG_RAW(...) {do{\LOG_PRINTF(__VA_ARGS__);\}while(0);}

slog

//slog  emmc log//添加调试log到log缓冲
#define SLOG_DBG(mod, ...) do{ \LOG_STORE(mod,LOG_LVL_DBG, __VA_ARGS__);\}while(0);#define LOG_STORE       store_stm32    const char* g_lcLogLevelName[4] =
{"Info","Error","Warn","Debug",
};
//STM32
volatile uint8_t g_cursvLogLevel = LOG_LVL_DBG;
volatile uint8_t g_cursvlogOutputDir = LOG_OUTPUT_DIR_STORE;
volatile uint32_t g_cursvLogMod = (SV_LOG_MOD_SYS | SV_LOG_MOD_DRV | SV_LOG_MOD_SER | SV_LOG_MOD_GUI | SV_LOG_MOD_NFC | SV_LOG_MOD_BLE | SV_LOG_MOD_DUA | SV_LOG_MOD_TSK | SV_LOG_MOD_PWR | SV_LOG_MOD_LCD | SV_LOG_MOD_TP | SV_LOG_MOD_BAT);
void store_stm32(uint32_t mode, uint8_t level, const char *format, ...)
{if((g_cursvLogLevel >= level) && (g_cursvLogMod & mode)){{  va_list arg_ptr;Log_Message_t msg;time_rtc_t time;uint8_t HeadLen = 0;  if(LogPoolID == NULL)return;msg.pMsgData = osPoolAlloc(LogPoolID);  //内存池if (msg.pMsgData){if(level > 4) level = 4;if(level < 1) level = 1;msg.msg_type = MSGTYPE_LOG;            va_start(arg_ptr, format);service_rtc_Get(&time);{HeadLen = (strlen(g_lcLogLevelName[level-1]) + 35);snprintf((char *)msg.pMsgData, HeadLen+1, "\r\n[%02d-%02d-%02d %02d:%02d:%02d][%10u][%s]\t", time.yearL, time.month, time.date, time.hour, time.minute, time.second, osKernelSysTick(), g_lcLogLevelName[level-1]);msg.msgLength = vsnprintf((char *)&(msg.pMsgData->log.dataBuff[HeadLen]), LOG_MSG_BLOCK_SIZE - HeadLen, format, arg_ptr);            }msg.msgLength += HeadLen;if(msg.msgLength > LOG_MSG_BLOCK_SIZE){msg.msgLength = LOG_MSG_BLOCK_SIZE;LOG_RAW("stm32 log BLOCK_SIZE error\r\n");}            if(false == save_log_queue(&msg)){osPoolFree(LogPoolID, msg.pMsgData);}va_end(arg_ptr);}return;}  }
}//通过消息队列,执行下面的log存储typedef struct
{uint8_t  stm32_index;uint32_t stm32_pos;uint8_t stm32_buff_first[LOG_BUFF_SIZE_STM32];uint8_t stm32_buff_second[LOG_BUFF_SIZE_STM32];
}log_buff_t;
log_buff_t _g_log_buffer;
static bool log_data_update(log_type_e logType, const uint8_t* log, uint32_t len, uint8_t needFlush)
{uint8_t *pBuff = NULL;uint8_t  *pIndex = NULL;uint32_t  *pPos = NULL;uint8_t  *pBuff_first = NULL;uint8_t  *pBuff_second = NULL;uint32_t log_BuffSize = 0;log_type_e logType_curr = logType;uint8_t  log_type_max = 1;if(needFlush)//需要立即存,保存所有log缓存到文件{log_type_max = 4;}for(int i = 0;i < log_type_max;i++){logType_curr = (log_type_e)(logType << i);switch(logType_curr){case LOG_TYPE_STM32:log_BuffSize = LOG_BUFF_SIZE_STM32;pPos = &_g_log_buffer.stm32_pos;pIndex = &_g_log_buffer.stm32_index;pBuff_first = _g_log_buffer.stm32_buff_first;pBuff_second = _g_log_buffer.stm32_buff_second;break;default:FLOG_STORE("No such type of log!");return false;}if(((*pPos + len) > log_BuffSize) || (needFlush && ((*pPos + len) > 0))){pBuff = (0 == *pIndex) ? pBuff_first : pBuff_second;log_file_update(logType_curr, pBuff, *pPos);  //将log存储到文件中*pPos = 0;*pIndex = !(*pIndex);}pBuff = (0 == *pIndex) ? pBuff_first : pBuff_second;memcpy(&pBuff[*pPos], log, len);*pPos += len;}return true;
}

pusart log以及slog相关推荐

  1. Android Log和Slog类详解--Android 12

    Log类的路径在/frameworks/base/core/java/android/util/Log.java Slog类的路径在/frameworks/base/core/java/android ...

  2. Android系统开发(3)---如何分析ANR Log的总结

    如何分析ANR Log的总结 引起ANR问题的根本原因,总的来说可以归纳为两类: 应用进程自身引起的,例如: 主线程阻塞.挂起.死循环 应用进程的其他线程的CPU占用率高,使得主线程无法抢占到CPU时 ...

  3. libslog---高性能开源C/C++多线程安全日志库

    Fromwiki: https://code.google.com/p/easynetwork/wiki/libslog libslog是一个基于linux的高性能开源C/C++多线程安全日志库.Ea ...

  4. android studio撤销按钮,Android Studio无法撤消(Android Studio Can't Undo)

    Android Studio无法撤消(Android Studio Can't Undo) 有时候当我尝试撤销Android Studio中的更改时,我得到以下结果: 无法撤消 受此操作影响的文件已被 ...

  5. 使用IDM下载,不适用默认浏览器下载

    google浏览器是不能够安装的除非有v*p*n() Firefox浏览器可以安装js脚本   推荐使用 1 google 扩展 IDMan628  扩展程序里面加 IDMGCExt.crx 2 扩展 ...

  6. 文件服务器监控用户修改信息,文件服务器监控日志软件

    文件服务器监控日志软件 内容精选 换一换 有以下几种现象:将制作好的SD卡插入开发者板并上电后,开发者板LED1与LED2灯状态信息异常.将制作好的SD卡插入开发者板,并通过USB方式连接Ubuntu ...

  7. windows服务器网站日志,windows服务器网站日志文件

    windows服务器网站日志文件 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. ...

  8. Redis进阶实践之二十 Redis的配置文件使用详解

    一.引言 写完上一篇有关redis使用lua脚本的文章,就有意结束Redis这个系列的文章了,当然了,这里的结束只是我这个系列的结束,但是要学的东西还有很多.但是,好多天过去了,总是感觉好像还缺点什么 ...

  9. Android源码-Logger日志系统

    Android提供的日志功能是基于liunx中的Logger日志驱动实现,日记驱动是个啥子东东?就是一个虚拟设备,在kernel内核中的一块内存. 整个Android系统的日志有4种类型(括号内为对应 ...

最新文章

  1. R语言绘制堆叠面积图
  2. eclipse修改文件代码不起作用,输出时还是老的,估计是缓存问题
  3. DES算法C语言实现
  4. CVPR 2018 Siam-RPN:《High Performance Visual Tracking with Siamese Region Proposal Network》论文笔记
  5. 中职专业课教师资格证计算机,中职专业课教师资格证报考科目是什么?
  6. 如何让IOS中的文本实现3D效果
  7. 142. 环形链表 II golang
  8. php操作带中文的json数据
  9. dw替换多个html标签,DW查找替换的技巧
  10. 吞噬星空怎么会有鸿蒙,论吞噬星空与鸿蒙的关系
  11. C++头文件重复定义问题的处理(不会看看,会了防身!)
  12. 赋值语句、变量、数学表达式、位运算详解(C++)
  13. 《C陷阱与缺陷》读书笔记
  14. wdr7300百兆版_TPLINK WDR7660千兆版无线路由器拆机
  15. 于朦胧 机器人_机器人演戏?建议于朦胧陈钰琪这部《两世欢》改名:我的面瘫男友...
  16. Python 使用turtle在画布的随机位置绘制颜色随机的五角星
  17. 会编程的都来玩玩这个游戏吧,看看你的编程水平.
  18. 港科夜闻|香港科大举办网上招生说明会,详细解读招生政策。
  19. Linux防火墙firewall只允许特定IP访问
  20. freeRTOS — 软件定时器的使用

热门文章

  1. 2022年最新redis面试题
  2. c语言下标法改为指针变量法,C语言教材第七章指针实验.doc
  3. iOS开源框架及项目大全(一定有你想要的,后期在不断进行分类方便大家查阅)
  4. NVIDIA GTC主题演讲内容学习<2>
  5. 前端页面有哪三层构成 兼容性
  6. .NET 6 出现在 Ubuntu 上——但 Linux 的 MAUI 在哪里?
  7. DEV-C++双人抢滩登陆1.1版推出了
  8. Java中,overload与override的区别
  9. overload,override
  10. Python每日一学 03——计算半径为r的圆的面积