日志(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)不同,两路串口可同时工作。