跳转至

日志(LOG)


1. 概述

LOG日志输出组件目前仅可以通过串口打印调试信息,故目前仅用于调试,打印信息参考Andriod Logcat设置有6个等级,说明如下:

打印等级 说明
CI_LOG_VERBOSE 详细日志,最高打印等级,用于输出所有日志信息
CI_LOG_DEBUG 调试日志,该类型日志常用于产品开发阶段使用,输出调试信息
CI_LOG_INFO 信息日志,该类型日志用于输出关键信息以方便确认系统状态
CI_LOG_WARN 警告信息,该类型日志用于打印警告信息,表明系统可能遇到问题尝试修复
CI_LOG_ERROR 错误信息,该类型日志用于打印错误信息,报告系统遇到问题
CI_LOG_ASSERT 断言信息,该类型日志用于打印严重错误,即系统遇到严重问题完全无法运行

使用该组件在程序响应位置添加输出信息,可以更好的检测系统运行状态,这在产品开发阶段定位调试问题时帮助极大。


2. 使用说明

该组件源代码位于SDK的 components\log\ 目录下,包括ci_log.c、ci_log.h、ci_log_config.h、ci_assert.h四个文件组成,其中ci_log.c、ci_log.h我们已经实现了相关串口输出打印代码,一般不需要修改,使用者仅使用ci_log_config.h进行配置,相关宏配置说明如下:

2.1. 配置

日志组件的开关和输出串口在 system\sdk_default_config.h(或工程 user_config.h)中配置,CONFIG_CI_LOG_UART 非0则使能该模块(CONFIG_CI_LOG_EN=1),为0则不会输出打印信息,所有打印代码由宏实现故不会加入编译。

/* 串口调试LOG输出 */
#define CONFIG_CI_LOG_UART                  HAL_UART0_BASE

使能后由以下宏选择日志输出串口:

/* 日志打印使用的串口 */
#define CONFIG_CI_LOG_UART_PORT     ((UART_TypeDef*)CONFIG_CI_LOG_UART)

其他相关配置:

宏 说明
UART_LOG_UASED_INT_MODE 日志中断输出模式(默认0关闭)
UART_LOG_BUFF_SIZE 日志buffer大小(默认256字节)
USE_STD_PRINTF 1:使用标准printf;0:使用SDK内置_printf

2.2. 添加模块统一打印等级

在ci_log_config.h中可以自定义一个LOG_*的模块打印等级宏,如下所示,通过在相同模块填写该模块的宏等级,这样便可以针对不同模块选择不同的打印等级。

/* 打印等级 */
#define LOG_SYS_INFO                CI_LOG_DEBUG
#define LOG_PM                      CI_LOG_INFO
#define LOG_ASR                     CI_LOG_INFO
#define LOG_WIFI_EVENT              CI_LOG_INFO
#define LOG_AUDIO_PLAY              CI_LOG_INFO
#define LOG_SYS_MONITOR             CI_LOG_INFO
#define LOG_COM_UART                CI_LOG_INFO
#define LOG_NVDATA                  CI_LOG_INFO
#define LOG_CMD_INFO                CI_LOG_INFO
#define LOG_CODEC_MANAGE            CI_LOG_INFO
#define LOG_BAUDRATE_CALIBRATE      CI_LOG_INFO
#define LOG_USER                    CI_LOG_INFO

SDK预置的模块等级宏还包括:LOG_IIC_DRIVER、LOG_QSPI_DRIVER、LOG_GPIO_DRIVER、LOG_FLASH_DATA、LOG_FAULT_INT、LOG_ASR_PCM_BUF、LOG_AUDIO_IN、LOG_IR、LOG_OTA、LOG_VOICE_UPLOAD、LOG_VOICE_CAPTURE、LOG_SSP_MODULE、LOG_CWSL、LOG_CINN等,用户可在 user_config.h 中覆盖定义。

2.3. 打印函数

如API参考所述,打印函数包括如下(带参宏实现):

/** @brief 日志打印--详细 */
#define ci_logverbose(comlevel, message, args...)
/** @brief 日志打印--调试 */
#define ci_logdebug(comlevel, message, args...)
/** @brief 日志打印--信息 */
#define ci_loginfo(comlevel, message, args...)
/** @brief 日志打印--警告 */
#define ci_logwarn(comlevel, message, args...)
/** @brief 日志打印--错误 */
#define ci_logerr(comlevel, message, args...)
/** @brief 日志打印--断言 */
#define ci_logassert(comlevel, message, args...)

此外还提供不带等级的格式化打印宏 mprintf,以及日志模块初始化函数:

void ci_log_init(void);

使用示例如下:

#define LOG_TEST_APP                  CI_LOG_DEBUG

int test_log(void)
{
    int test_index = 0;
    ci_logverbose(LOG_TEST_APP, "logverbose %d", test_index++);
    ci_logdebug(LOG_TEST_APP, "logdebug %d", test_index++);
    ci_loginfo(LOG_TEST_APP, "loginfo %d", test_index++);
    ci_logwarn(LOG_TEST_APP, "logwarn %d", test_index++);
    ci_logerr(LOG_TEST_APP, "logerr %d", test_index++);
    ci_logassert(LOG_TEST_APP, "logassert %d", test_index++);
}

注意

ci_logxxx系列是通过宏实现,切勿将需要使用的函数作为参数以打印函数返回值,这将导致在宏被关闭时函数得不得调用。


3. 常见问题

  • 由于日志输出组件需要使用串口,务必要在系统初始化时初始化相应串口方可使用。
  • CI14LP的日志串口默认为UART0(CONFIG_CI_LOG_UART = HAL_UART0_BASE),与串口协议默认使用的UART1(UART_PROTOCOL_NUMBER)不同,两路串口可同时工作。