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

输出调试Log

GR5526 SDK支持自定义输出方式从硬件端口(UART、J-Link RTT或ARM ITM(Instrumentation Trace Macrocell))输出Application的调试Log。为方便开发者使用,GR5526 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\components\libraries\bsp\bsp.h),并注册相应的发送和Flush函数,可参考函数user_log_debug_init()。以UART输出方式为例,接口如下:

static void user_log_debug_init(void)
{
    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;

    app_log_init(&log_init, bsp_uart_send, bsp_uart_flush);

#if APP_LOG_STORE_ENABLE
    app_log_store_info_t store_info;
    app_log_store_op_t   op_func;

    store_info.nv_tag   = APP_LOG_NVDS_TAG;
    store_info.db_addr  = APP_LOG_DB_START_ADDR;
    store_info.db_size  = APP_LOG_DB_SIZE;
    store_info.blk_size = APP_LOG_ERASE_BLK_SIZE;

    op_func.flash_init  = hal_flash_init;
    op_func.flash_erase = hal_flash_erase;
    op_func.flash_write = hal_flash_write;
    op_func.flash_read  = hal_flash_read;
    op_func.time_get    = NULL;

    app_log_store_init(&store_info, &op_func);
#endif

}
说明:
  • app_log_init()接口的入参包括Log初始化参数、Log输出接口和Flush接口。其中Flush接口可以不注册。
  • GR5526 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接口)和hal_uart同步(hal_uart_transmit接口)两种方式的输出接口,用户可根据具体的应用选择合适的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全部输出。

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

图 31 创建RTT Control block并置于地址0x20005000处

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

图 32 配置J-Link RTT Viewer

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

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

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

扫描关注

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