pusart log以及slog
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相关推荐
- Android Log和Slog类详解--Android 12
Log类的路径在/frameworks/base/core/java/android/util/Log.java Slog类的路径在/frameworks/base/core/java/android ...
- Android系统开发(3)---如何分析ANR Log的总结
如何分析ANR Log的总结 引起ANR问题的根本原因,总的来说可以归纳为两类: 应用进程自身引起的,例如: 主线程阻塞.挂起.死循环 应用进程的其他线程的CPU占用率高,使得主线程无法抢占到CPU时 ...
- libslog---高性能开源C/C++多线程安全日志库
Fromwiki: https://code.google.com/p/easynetwork/wiki/libslog libslog是一个基于linux的高性能开源C/C++多线程安全日志库.Ea ...
- android studio撤销按钮,Android Studio无法撤消(Android Studio Can't Undo)
Android Studio无法撤消(Android Studio Can't Undo) 有时候当我尝试撤销Android Studio中的更改时,我得到以下结果: 无法撤消 受此操作影响的文件已被 ...
- 使用IDM下载,不适用默认浏览器下载
google浏览器是不能够安装的除非有v*p*n() Firefox浏览器可以安装js脚本 推荐使用 1 google 扩展 IDMan628 扩展程序里面加 IDMGCExt.crx 2 扩展 ...
- 文件服务器监控用户修改信息,文件服务器监控日志软件
文件服务器监控日志软件 内容精选 换一换 有以下几种现象:将制作好的SD卡插入开发者板并上电后,开发者板LED1与LED2灯状态信息异常.将制作好的SD卡插入开发者板,并通过USB方式连接Ubuntu ...
- windows服务器网站日志,windows服务器网站日志文件
windows服务器网站日志文件 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. ...
- Redis进阶实践之二十 Redis的配置文件使用详解
一.引言 写完上一篇有关redis使用lua脚本的文章,就有意结束Redis这个系列的文章了,当然了,这里的结束只是我这个系列的结束,但是要学的东西还有很多.但是,好多天过去了,总是感觉好像还缺点什么 ...
- Android源码-Logger日志系统
Android提供的日志功能是基于liunx中的Logger日志驱动实现,日记驱动是个啥子东东?就是一个虚拟设备,在kernel内核中的一块内存. 整个Android系统的日志有4种类型(括号内为对应 ...
最新文章
- R语言绘制堆叠面积图
- eclipse修改文件代码不起作用,输出时还是老的,估计是缓存问题
- DES算法C语言实现
- CVPR 2018 Siam-RPN:《High Performance Visual Tracking with Siamese Region Proposal Network》论文笔记
- 中职专业课教师资格证计算机,中职专业课教师资格证报考科目是什么?
- 如何让IOS中的文本实现3D效果
- 142. 环形链表 II golang
- php操作带中文的json数据
- dw替换多个html标签,DW查找替换的技巧
- 吞噬星空怎么会有鸿蒙,论吞噬星空与鸿蒙的关系
- C++头文件重复定义问题的处理(不会看看,会了防身!)
- 赋值语句、变量、数学表达式、位运算详解(C++)
- 《C陷阱与缺陷》读书笔记
- wdr7300百兆版_TPLINK WDR7660千兆版无线路由器拆机
- 于朦胧 机器人_机器人演戏?建议于朦胧陈钰琪这部《两世欢》改名:我的面瘫男友...
- Python 使用turtle在画布的随机位置绘制颜色随机的五角星
- 会编程的都来玩玩这个游戏吧,看看你的编程水平.
- 港科夜闻|香港科大举办网上招生说明会,详细解读招生政策。
- Linux防火墙firewall只允许特定IP访问
- freeRTOS — 软件定时器的使用
热门文章
- 2022年最新redis面试题
- c语言下标法改为指针变量法,C语言教材第七章指针实验.doc
- iOS开源框架及项目大全(一定有你想要的,后期在不断进行分类方便大家查阅)
- NVIDIA GTC主题演讲内容学习<2>
- 前端页面有哪三层构成 兼容性
- .NET 6 出现在 Ubuntu 上——但 Linux 的 MAUI 在哪里?
- DEV-C++双人抢滩登陆1.1版推出了
- Java中,overload与override的区别
- overload,override
- Python每日一学 03——计算半径为r的圆的面积