DFX子系统

简介

该仓库用于存放DFX框架的代码。主要包含DFR(可靠性)和DFT(可测试性)特性。

由于芯片平台资源有限,且硬件平台多样,因此需要针对不同硬件架构和资源提供组件化且可定制的DFX框架。根据RISC-V、Cortex-M、Cortex-A不同硬件平台,提供两种不同的轻量级DFX框架,以下简称mini、featured。

  • mini框架:针对处理架构为Cortex-M或同等处理能力的硬件平台,系统内存一般低于512KB,无文件系统或者仅提供一个可有限使用的轻量级文件系统,遵循CMSIS接口规范。
  • featured框架:处理架构为Cortex-A或同等处理能力的硬件平台,内存资源大于512KB,文件系统完善,可存储大量数据,遵循POSIX接口规范。

目录

表 1 轻量级DFX子系统源代码目录结构

名称 描述
interface 存放所有对外接口定义头文件
interfaces/kits/hilog featured框架流水日志对外接口定义
interfaces/kits/hilog_lite mini框架流水日志对外接口定义
interfaces/innerkits/hievent_lite mini框架事件打点对外接口定义
services/hilogcat_lite 流水日志相关服务和命令
services/hilogcat_lite/apphilogcat featured框架流水日志落盘服务
services/hilogcat_lite/command mini框架dfx命令
services/hilogcat_lite/hilogcat featured框架流水日志输出命令
services/hiview_lite DFX框架服务化注册
frameworks/ddrdump_lite mini框架ddrdump信息转储
frameworks/hievent_lite mini框架事件打点记录实现
frameworks/hilog_lite 流水日志接口实现
frameworks/hilog_lite/featured featured框架流水日志接口实现
frameworks/hilog_lite/mini mini框架流水日志接口实现
utils/lite 公共基础操作定义实现。包含了miini框架的config配置

约束

mini框架整体代码使用标准C开发,对外的接口依赖统一通过util封装,如软硬件平台不同需要适配,需要在vendor下实现适配处理。

使用-mini框架

DFX-mini是一套简单小巧的DFX设计,对外提供log功能:

  • 以下以A模块为例说明如何添加模块并进行日志打印。
  1. 第一步添加模块ID

    在interfaces/kits/hilog_lite/hiview_log.h的HiLogModuleDef中添加HILOG_MODULE_A定义。

    ```

    1. typedef enum {
    2. /* DFX /
    3. HILOG_MODULE_HIVIEW = 0,
    4. /* System Module A /
    5. HILOG_MODULE_A,
    6. /* Maximum number of modules /
    7. HILOG_MODULE_MAX
    8. } HiLogModuleType; ```
    9. 第二步模块注册

    在A模块的初始化流程中添加如下代码,注册模块到日志框架中:

    ```

    1. HiLogRegisterModule(HILOG_MODULE_SAMGR, "A"); ```
    2. 第三步调整DFX框架静态配置

    根据需要调整

    ```

    1. utils/lite/hiview_config.c ```

    的g_hiviewConfig全局参数配置。默认情况下不用修改,日志默认输出到串口。

    配置项 取值及含义
    outputOption 日志的输出方式。取值如下: OUTPUT_OPTION_DEBUG 日志不进行跨任务调度直接输出到串口,仅适合临时调测使用。 OUTPUT_OPTION_FLOW 日志流式输出到串口(默认设置) OUTPUT_OPTION_TEXT_FILE 日志输出为文本文件 OUTPUT_OPTION_BIN_FILE 日志输出为二进制文件(后续支持)
    level 日志的输出级别,仅输出大于等于该级别的日志。取值如下: HILOG_LV_DEBUG/ HILOG_LV_INFO/ HILOG_LV_WARN/ HILOG_LV_ERROR/ HILOG_LV_FATAL
    logSwitch 流水日志功能开关。编译前关闭不影响log组件初始化。默认打开。取值如下: HIVIEW_FEATURE_ON/ HIVIEW_FEATURE_OFF
    dumpSwitch dump功能开关。编译前关闭则不再初始化DUMP组件。默认关闭。取值如下: HIVIEW_FEATURE_ON/ HIVIEW_FEATURE_OFF
    eventSwitch 事件功能开关。编译前关闭则不再初始化DUMP组件。默认关闭。取值如下: HIVIEW_FEATURE_ON/ HIVIEW_FEATURE_OFF
    4. 第四步日志打印

    在需要打印日志的.c文件中 #include “log.h”,调用如下接口:

    HILOG_INFO(HILOG_MODULE_SAMGR, “log test: %d”, 88);

    接口参数说明:

    参数名 是否必填 参数类型 参数说明
    mod uint8 模块\服务的ID。 统一规划分配,最大支持64个,其中第三方APP统一使用HILOG_MODULE_APP作为模块ID。
    fmt char * 格式化输出字符串。 1、 最大支持6个可变参数,不支持%s。 2、 格式化后的单条日志最大长度128字节,超过将无法打印。
    可变参 int32 仅支持数字类型,最大支持6个变参。

DFX featured框架提供完整的DFX特性,对外提供log接口:

Native C/C++接口

hilog 可用API


1. HILOGD(fmt,...) HILOGI(fmt,...) HILOGW(fmt,...) HILOGE(fmt,...)

使用介绍

首先需要定义TAG,DOMAIN需要找DFT申请,未经申请的DOMAIN,日志打印不出来。

本地调试,可以临时使用domain数值 0。

包含头文件:#include

在BUILD.gn中添加依赖库 libhilog。

接口规则介绍:

  1. 格式化字符串默认是非隐私 HILOGI(“Hello World\n”); >> Hello World
  2. 格式化参数默认是隐私 HILOGI(“Age is %d\n”, 10); >> Age is
  3. %{private}标识的参数是隐私 HILOGI(“Age is %{private}d\n”, 10); >> Age is
  4. %{public}标识的参数是非隐私 HILOGI(“Age is %{public}d\n”, 10); >>Age is 10

接口参数介绍

参数名字 参数含义
domain 领域标识ID,需要找DFT申请,未经申请的domain会出现日志打印不出来的问题
tag 日志tag
isFmtPrivate 标识格式化字符串fmt是否是隐私,是yes时fmt会被认为是隐私
fmt 格式化字符串
args 格式化字符串参数

日志查看

  1. debug版本hilog日志会保存到/storage/data/log/hilogs 目录下面。
  2. 可以执行hilogcat实时查看hilog日志。

日志系统架构

DFX子系统 - 图1

  1. hilogtask流水日志的内核任务。
  • 此功能是一个linux内核的任务或者线程,在系统启动时初始化。
  • 当内核中一个模块调用它的日志接口,将格式化好的日志内容传输给改任务,并将其存储在一个环形缓冲区中 。
  • 当用户态调用日志接口,将格式化好的日志内容通过ioctl调用写入驱动节点,驱动节点再将日志内容发送到hilogtask,hilogtask将日志内容存储到环形缓冲区中。 2. hilogcatd用户态日志存储服务。

  • 这是一个用户态的进程,负责定时将内核的ringbuffer读取出来,存储到日志文件中。

  • 日志文件输出支持gzip压缩,使用zlib
  • 每个类型的ringbuffer分开存储。
  • 存储文件的单个文件大小,文件个数可在编译时配置。 3. hilogcat日志查看命令行工具。

从内核驱动接口读取ringbuffer内容,输出到标准输出。 4. 支持日志缓冲区可配置。

  • 编译时可以配置日志缓冲区的大小。
  • 编译时可以指定日志缓冲区的类型,类型个数就是ringbuffer的个数。

涉及仓

hiviewdfx_frameworks_hievent_lite

hiviewdfx_frameworks_ddrdump_lite

hiviewdfx_frameworks_hilog_lite

hiviewdfx_interfaces_innerkits_hilog

hiviewdfx_interfaces_innerkits_hievent_lite

hiviewdfx_interfaces_kits_hilog

hiviewdfx_interfaces_kits_hilog_lite

hiviewdfx_services_hiview_lite

hiviewdfx_services_hilogcat_lite

hiviewdfx_utils_lite