Debug

Assertion

SDK中有如下三类断言:

  • ls_assert

    SDK源码中的断言,意味着产生了”不可能“出现的条件。会输出断言产生的具体源文件代码位置。

  • ls_ram_assert

    SDK源码中的断言,但发生在RAM中执行的函数内。由于RAM中的函数常常不可访问Flash指令,因此专门区分出RAM函数内发生的断言。

  • stack_assert_c

    协议栈二进制固件中的断言。会抛出断言级别、断言发生的返回地址和相关参数。需要原厂分析具体原因。只有LVL_ERROR级别的断言会停止程序。

当量产产品经过充分测试验证后,为了避免极低概率的系统死机,可以将上述断言中程序停止死循环的代码,改为系统复位。但务必不要在量产产品充分测试验证前这样处理,因为会造成异常现场丢失,不利于排查问题。

LOG

特点

  • 支持日志分级全局和源文件静态编译控制

  • 支持定义源文件日志标签

  • 支持多种输出,包括:J-LINK RTT、UART

#define LVL_ERROR 1
#define LVL_WARN 2
#define LVL_INFO 3
#define LVL_DBG  4

系统定义了上述四个日志级别,分别对应四个输出宏:

LOG_E(...)
LOG_W(...)
LOG_I(...)
LOG_D(...)

使用格式等同于printf

GLOBAL_OUTPUT_LVL

对于全局日志输出级别控制,小于等于GLOBAL_OUTPUT_LVL级别的日志会被编译。

默认情况下,

#ifndef GLOBAL_OUTPUT_LVL
#define GLOBAL_OUTPUT_LVL     LVL_DBG
#endif

文件级标签和输出级别控制

源文件使用LOG_x宏,需要包含log.h头文件

#define LOG_TAG ...
#define LOG_LVL	...
#include "log.h"

在包含log.h头文件前,可以定义LOG_TAGLOG_LVL

LOG_TAG为当前文件的标签,内容为字符串,当前文件使用LOG_x宏输出日志,输出内容中均会包含该标签。若未定义,默认值为"NO_TAG"。

LOG_LVL为当前文件日志级别。当前文件中所有小于等于LOG_LVL级别的日志会被编译。默认值为LVL_DBG

裸输出

  • LOG_RAW

    格式等同于printf。输出内容不含任何参数之外的信息。编译件:GLOBAL_OUTPUT_LVL!=0

  • LOG_HEX(data_pointer,data_length)

    输出data_pointer地址开始data_length长度的数据的十六进制格式。低地址在前。编译条件:GLOBAL_OUTPUT_LVL!=0

Multiple Backends

#define JLINK_RTT          1
#define UART_LOG           2
#define LOG_BACKEND (JLINK_RTT|UART_LOG)

上述LOG_BACKEND定义在log.c文件中,即向JLINK_RTT和UART_LOG两种后端输出日志。

#define LOG_UART_TXD (PB00)
#define LOG_UART_RXD (PB01)

定义了UART_LOG具体输出管脚。