7.20. PRINTF
Overview 提供打印的多种方式应用示例和常见问题。
7.20.1. 应用示例
示例演示:
各种user_printf的使用示例
example: 进入 apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏 USE_PRINTF_TEST_DEMO
。
- 各种字母在打印中代表的意思:
(
网络歌曲下载缓存中。)
网络歌曲下载缓存中。{
低功耗模式下,RF休眠后触发系统休眠。}
低功耗模式下,RF休眠后触发的系统休眠已经唤醒。<
低功耗模式下,在没有打开RF的情况下,触发系统休眠。>
低功耗模式下,在没有打开RF的情况下,触发的系统休眠已经唤醒。C
LWIP收到的包如果是ICMP包并且不是echo和echo reply就丢弃,因为是一些Time_Ex等无用包。D
LWIP的PBUF_POOL在剩余小于PBUF_RESERVED_FOR_TCP的情况下,丢弃非TCP包。X
LWIP的PBUF_POOL用完了了,wifi底层收到的包直接丢弃Y
LWIP的PBUF_POOL在剩余小于PBUF_RESERVED_FOR_ARP的情况下, 丢弃收到的非ARP包E
BLE通讯可以发送消息。F
经典蓝牙播放A2DP媒体流时,btctrler底层硬件的接收BUF已满。G
WIFI底层硬件的TX缓冲队列已空,上层发出去的包直接丢弃。H
WIFI底层硬件的TX缓冲队列在剩余小于WIFI_TXQ_RESERVED_FOR_TCP的情况下,丢弃上层发出去的非TCP包。O
WIFI底层硬件的TX缓冲队列在剩余小于WIFI_TXQ_RESERVED_FOR_ARP的情况下,丢弃非ARP包。@
空中干扰/网络拥塞严重的情况,WIFI底层发送较慢,LWIP 发送UDP包处于BUSY|
空中干扰/网络拥塞严重的情况,WIFI底层发送较慢,LWIP 发送非UDP包处于BUSYJ
jpeg解码硬件底层buffer出现写越界的情况。R
JPEG图片解码模式下,图片位流是分MCU行(YUV420/422,16行),不是整帧模式。I
经典蓝牙已打开可发现性。P
经典蓝牙已打开可连接性。Q
经典蓝牙正在回连中。K
经典蓝牙A2DP播放时收到的包出现丢失或者序号出错。M
蓝牙发射器发送媒体音频流时出现解码跟不上的情况。N
蓝牙发射器发送媒体音频流时出现解码数据不足的情况。W
立刻唤醒正在休眠的wifi后发送数据。Z
wifi底层硬件的收发缓冲buf不足。$
BLE当前事件收不到包,关闭latency。#
等待BT链路释放。y
A2DP链路buffer剩余大小小于1000,通常为链接有干扰或采样率不匹配导致。LA
wifi set psm bitLB
wifi clear psm bit
7.20.2. 常见问题
如何关闭
Y
等字母打印答: 搜索
putchar
,在wifi_conf.c
中注释掉对应的putchar('Y')
即可。其他字母打印同样全局搜索putchar
,只能逐个注释。如何关闭所有打印,节省代码和内存
答: 在
app_config.h
屏蔽CONFIG_DEBUG_ENABLE
系统每分钟定时打印任务栈信息,如何关闭?
答: 在
app_config.h
屏蔽RTOS_STACK_CHECK_ENABLE //是否启用定时检查任务栈
如何关闭SDK原来所有打印,只保留用户新增的打印
如何关闭全部log_x的打印
答:code_blocks的build_options编译选项中Compiler setting -> #define的全局宏中默认定义有CONFIG_RELEASE_ENABLE
如果没有定义该宏,则在
lib_driver_config.c
中CONFIG_DEBUG_LIB(TRUE)的对应log打印开启。如下图所示。//app_config.h #ifdef CONFIG_RELEASE_ENABLE #define LIB_DEBUG 0 #else #define LIB_DEBUG 1 #endif #define CONFIG_DEBUG_LIB(x) (x & LIB_DEBUG)
跟音频相关的log_x打印(编码服务、解码服务、EQ等)在
audio_config.c
中配置开关//编码、解码和音频服务相关打印不受CONFIG_RELEASE_ENABLE通过CONFIG_DEBUG_LIB控制,可自行定义相关log开关 const char log_tag_const_v_AUDIO_SERVER AT(.LOG_TAG_CONST) = 0; const char log_tag_const_d_AUDIO_SERVER AT(.LOG_TAG_CONST) = 0; const char log_tag_const_i_AUDIO_SERVER AT(.LOG_TAG_CONST) = 1; const char log_tag_const_w_AUDIO_SERVER AT(.LOG_TAG_CONST) = 1; const char log_tag_const_e_AUDIO_SERVER AT(.LOG_TAG_CONST) = 1; const char log_tag_const_v_AUDIO_ENCODER AT(.LOG_TAG_CONST) = 0; const char log_tag_const_d_AUDIO_ENCODER AT(.LOG_TAG_CONST) = 0; const char log_tag_const_i_AUDIO_ENCODER AT(.LOG_TAG_CONST) = 1; const char log_tag_const_w_AUDIO_ENCODER AT(.LOG_TAG_CONST) = 1; const char log_tag_const_e_AUDIO_ENCODER AT(.LOG_TAG_CONST) = 1; const char log_tag_const_v_AUDIO_DECODER AT(.LOG_TAG_CONST) = 0; const char log_tag_const_d_AUDIO_DECODER AT(.LOG_TAG_CONST) = 0; const char log_tag_const_i_AUDIO_DECODER AT(.LOG_TAG_CONST) = 1; const char log_tag_const_w_AUDIO_DECODER AT(.LOG_TAG_CONST) = 1; const char log_tag_const_e_AUDIO_DECODER AT(.LOG_TAG_CONST) = 1;
WEBSOCKET库的打印控制在
wifi_conf.c
中配置开关如何动态开关打印
答: extern int config_debug_enable,设置config_debug_enable值为0关闭打印,为1打开打印
注意:动态控制打印使用打印保存到TF卡时会有丢失问题,可使用sd_log_flush()强制将打印buf的缓存写入sd中,之后再使用config_debug_enable = 0关闭打印
如何把打印输出到TF卡里面保存成文件
答:
(1)在 ``dubug_user.c``中开启宏定义
#CONFIG_SDCARD_DEBUG_ENABLE//开关SD卡记录打印信息
注意:打印保存到sd中使用缓存buf,buf每满10k写入一次到sd卡中(避免频繁写sd),不满则不写入,如需查看最后打印可以使用sd_log_flush()强制将打印buf的缓存写入sd中,或者使用动态开关打印时候,关打印前强制将缓存写入sd中
如何把打印输出到云端服务器保存
答:
(1)在
dubug_user.c
中开启宏定义#define CONFIG_NETWORK_DEBUG_ENABLE //可以触发打印信息上传到服务器端
(2)打开云串口调试工具,获取KeyCode值,并将生成的KeyCode值写到 ``dubug_user.c``的#define LOG_KEYCODE“”中如:
#define LOG_KEYCODE “KRPNOCNSTGUMSRNL” //客户随机填写12-16个字符串,用于日志查询
(3)开启wifi,使用STA模式,具体可以参考
wifi
配置(4)定时调用void upload_log_trig(void);函数,具体定时中断可以参考
timer
配置(5)在云串口调试工具中查看日志,关于云串口调试工具的使用可以参考
云串口调试工具.pdf
如何使用USB虚拟串口作为打印口
答:
(1)在
dubug_user.c
中开启宏定义#define CONFIG_USB_DEBUG_ENABLE //开关USB虚拟串口打印信息
(2)在
app_config.h
中增加宏定义#define TCFG_PC_ENABLE 1
#define USB_PC_NO_APP_MODE 2
#define TCFG_USB_SLAVE_ENABLE 1
#define TCFG_UDISK_ENABLE 0
#define USB_DEVICE_CLASS_CONFIG (CDC_CLASS)
注意:在使用打印输出到TF卡、打印输出到云端服务器保存和USB虚拟串口作为打印口时要在
app_config.h
中开启宏#defined CONFIG_DEBUG_ENABLE
在跑代码时,把串口拔掉。