CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

输出调试Log

GR551x SDK支持自定义输出方式从硬件端口(UART、J-Link RTT或ARM ITM(Instrumentation Trace Macrocell))输出Application的调试Log。为方便开发者使用,GR551x SDK提供了APP LOG模块。使用该模块时需在custom_config.h中打开宏APP_LOG_ENABLE,并根据开发者所需输出方式配置宏APP_LOG_PORT。

模块初始化

完成配置后,开发者还需要在外设初始化阶段,通过调用app_log_init()设置Log参数,注册Log输出接口、注册Flush接口完成APP LOG模块的初始化。APP LOG模块支持使用标准C库函数printf()和APP LOG API输出调试Log,若使用APP LOG API,还可以利用Log级别、格式、过滤方式等参数设置来优化Log;而若使用printf(),则可将Log参数设置为NULL。

根据开发者所设置的输出方式不同,调用相应模块的初始化函数(具体可见SDK_Folder\platform\boards\board_SK.h),并注册相应的发送和Flush函数,可参考函数bsp_log_init()。以UART输出方式为例,接口如下:

void bsp_log_init(void)
{
#if (APP_LOG_ENABLE == 1)

#if (APP_LOG_PORT == 0)
    bsp_uart_init();
#elif (APP_LOG_PORT == 1)
    SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
#endif

#if (APP_LOG_PORT <= 2)
    app_log_init_t   log_init; 

    log_init.filter.level                 = APP_LOG_LVL_DEBUG;
    log_init.fmt_set[APP_LOG_LVL_ERROR]   = APP_LOG_FMT_ALL & (~APP_LOG_FMT_TAG);
    log_init.fmt_set[APP_LOG_LVL_WARNING] = APP_LOG_FMT_LVL;
    log_init.fmt_set[APP_LOG_LVL_INFO]    = APP_LOG_FMT_LVL;
    log_init.fmt_set[APP_LOG_LVL_DEBUG]   = APP_LOG_FMT_LVL;

#if (APP_LOG_PORT == 0)
    app_log_init(&log_init, bsp_uart_send, bsp_uart_flush);
#elif (APP_LOG_PORT == 1)
    app_log_init(&log_init, bsp_segger_rtt_send, NULL);
#elif (APP_LOG_PORT == 2)
    app_log_init(&log_init, bsp_itm_send, NULL);
#endif

    app_assert_init();

#endif

#endif
}
说明:
  • app_log_init()接口的入参包括Log初始化参数、Log输出接口和Flush接口。其中Flush接口可以不注册。
  • GR551x SDK提供了APP LOG STORE模块,该模块支持将调试Log存入Flash中以及从Flash中导出。使用该模块时需在custom_config.h中打开宏APP_LOG_STORE_ENABLE。SDK_Folder\projects\ble\ble_peripheral\ble_app_rscs工程中配置了该功能,用户可参照该工程配置使用APP LOG STORE模块。
  • 使用printf()输出的Application Log无法使用APP LOG STORE模块进行存储。

当使用UART输出调试Log时,已实现的Log输出接口和Flush接口分别为bsp_uart_send和bsp_uart_flush。前者实现了app_uart异步(app_uart_transmit_async接口)Log输出方式;后者为uart_flush接口,用于中断模式下输出缓存在内存中的未发完的数据。这两个接口中的内容用户都可重写。

当使用J-Link RTT或ARM ITM输出调试Log时,已实现的Log输出接口分别为bsp_segger_rtt_send() 和 bsp_itm_send()。这两种模式下没有实现Flush接口。

使用方法

APP LOG模块初始化完成之后,开发者可以使用以下四个API输出调试Log:

  • APP_LOG_ERROR()
  • APP_LOG_WARNING()
  • APP_LOG_INFO()
  • APP_LOG_DEBUG()

如果使用了中断输出模式,可调用app_log_flush()函数将缓存中的全部调试Log输出,从而保证在芯片复位或系统睡眠前将调试Log全部输出。

当选择使用J-Link RTT方式输出Log时,推荐在SEGGER_RTT.c中做如下修改:

图 30 创建RTT Control block并置于地址0x00805000处

此时还需对J-Link RTT Viewer进行配置,配置方式如图 31所示。

图 31 配置J-Link RTT Viewer

其中RTT Control Block的位置通过Address方式指定,输入值可通过查询编译工程生成的.map映射文件中_SEGGER_RTT结构体的地址来获取,如下图所示。若按图 30推荐方式创建了RTT Control block并置于地址0x00805000处,则上图中可直接填入地址0x00805000

图 32 获取RTT Control Block地址
说明:

当使用GCC编译时,无需按照图 30修改,J-Link RTT Viewer中RTT Control Block地址为编译工程生成的.map映射文件中_SEGGER_RTT结构体的地址。

扫描关注

打开微信,使用“扫一扫”即可关注。