1、Log功能作用
日志打印(log)模块是分析程序流程和程序Bug的重要手段,嵌入式软件开发中,一般使用自己封装的Log程序模块,
而不会使用printf函数输出信息,原因如下:
1、可以在Log中封装数据流的接口,从而根据需求打印到各种终端,如下
(1):UART接口设备,可通过UART打印。
(2):显示屏设备,可以通过显示屏显示。
(3):用Jlink仿真器时,可通过Jlink RTT打印。
(4):等等不一一列举。
2、方便增加打印内容,可在不同类型日志前加上不同的信息前缀,错误信息前加代码行号方便定位
3、等等不一一列举
Log程序模块一般包含输出终端选择、日志开关、日志级别设置功能,用户可根据需求去使用Log
2、Log使用
2.1、终端选择
nRF52832的SDK提供两种输出终端:UART和JLINK-RTT, 在”sdk_config.h“中定义,如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f9c1b98b50a8494d89c72737a9662d55.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5rGfY2xw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.2、日志开关
nRF52832的SDK包含很多模块,某个出现问题,为了定位问题会需要其他模块不打印日志,只打印出问题的模块Log,
或者调试完成正式发布时,需要将Log全部关闭,便用到了日志开关,日志开关设置在”sdk_config.h“中定义,如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/94686cbda57d430d8a9c7a1e8c8e716e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5rGfY2xw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.3、日志级别
为了使打印的日志更具有针对性,比如只打印错误部分日志,或者只打印警告部分日志,日志级别便应运而生
nRF52832日志级别分为5个等级,设置在”sdk_config.h“中定义,如下图:
Off: 关闭日志输出
Error: 只输出错误信息,对应的Log输出函数为 ” NRF_LOG_ERROR “
Warning: 只输出警告信息,对应的Log输出函数为 ” NRF_LOG_WARNING “
Info: 只输出基本信息,对应的Log输出函数为 ” NRF_LOG_INFO “
Debug: 只输出调试信息,对应的Log输出函数为 ” NRF_LOG_DEBUG “
日志级别举例:
选择 Off 时,全部不打印
选择 Warning 时,只打印 Error, Warning 信息
选择 Debug 时,全部打印
![在这里插入图片描述](https://img-blog.csdnimg.cn/c5a5c46a40b945958f3d3885034b18f6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGf5rGfY2xw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
3、演示代码
使用 JLINK-RTT 打印 Log, 按上述步骤先配置好 sdk_config.h,再执行下面代码
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
static void log_init(void)
{
ret_code_t err_code = NRF_LOG_INIT(NULL);
APP_ERROR_CHECK(err_code);
NRF_LOG_DEFAULT_BACKENDS_INIT();
}
static void idle_state_handle(void)
{
if (NRF_LOG_PROCESS() == false)
{
}
}
int main(void)
{
log_init();
NRF_LOG_INFO("Log use JLINK-RTT");
while(1)
{
idle_state_handle();
}
}
2021/12/11