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包处于BUSY

    • J 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 bit

    • LB 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原来所有打印,只保留用户新增的打印

    答: 在 ``app_config.h ``增加两个宏定义

    #define CONFIG_USER_DEBUG_ENABLE

    #define CONFIG_SYS_DEBUG_DISABLE

    然后使用 printf.h 里面user_*的接口来实现打印,如user_printf

  • 如何关闭全部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

    在跑代码时,把串口拔掉。

7.20.3. API Reference