Scanner详解及数据更新机制
更新时间:2025/10/15
在Gitcode上查看源码

Scanner详解及数据更新机制

1. Scanner概述

Scanner是南向硬件访问框架的核心机制,负责从指定硬件芯片读取实时数据。所有已配置的Scanner由硬件代理(hwproxy)按照预设周期轮询扫描,将采集到的值更新到系统资源树供上层应用使用。

2. Scanner核心属性说明

属性名类型说明默认值
Chipro关联的硬件芯片对象-
ScanEnabledU8扫描使能状态
0: 禁用 1: 启用
1
StatusU8当前扫描状态
0: 正常 1: 失败 2: 防抖中 3: 禁用状态 4: 未初始化
4
ValueU64实际读取到的实时值-
NominalValueU64备用默认值(禁用时使用)-
PeriodU32扫描周期(单位:毫秒)
强制最小值为100
3000
FailureDebounceCountU8失败防抖阈值(连续失败次数超过此值触发失败状态)10
SuccessDebounceCountU8恢复防抖阈值(连续成功次数超过此值恢复正常状态)10

3. 数据更新机制

3.1 基本流程

  1. 周期扫描:硬件代理按Period周期轮询所有启用的Scanner(ScanEnabled=1)。
  2. 数据采集
    • 成功时:更新Value为实际值,Status=0
    • 失败时:触发防抖逻辑,连续失败超过FailureDebounceCountStatus=1
  3. 状态维护
    • 防抖状态(Status=2):连续失败未达阈值时的中间状态。
    • 禁用状态(Status=3):当ScanEnabled=0时自动进入。
  4. 备用值使用
    • Status=3时,Value替换为NominalValue

3.2 状态转换流程

3.3 防抖机制原理

  • 失败防抖:当连续失败次数超过FailureDebounceCount(默认10次)时,Status从2变为1。
  • 恢复防抖:在失败状态下,若连续成功次数超过SuccessDebounceCount(默认10次)时,Status从1恢复为0。
  • 作用:防止因瞬时硬件异常导致状态频繁波动。

4. 批量读取优化(通过SmcDfxInfo)

4.1 场景需求

针对同一硬件芯片的信息获取,系统通过批量读取减少硬件访问次数,提升系统吞吐量。

4.2 关键配置项

属性描述
Config定义字节与硬件信号的映射关系:
"字节序号": {信号名: 掩码值}
(示例:第1字节对应主版本号)
Mapping将Scanner值与硬件信号通过表达式关联:
"Scanner名称": {Value: "计算表达式"}
(支持位运算、拼接等复杂计算)
Context扩展字段,支持复杂计算场景:
如版本号拼接、多信号组合或硬件特定逻辑

4.3 配置示例

json
"SmcDfxInfo_CLU": {
  "Config": {
    "1": {"mcu_ver_major": 255},       // 第1字节表示主版本号(掩码255取完整字节值)
    "16": {"fan1_prsnt_n": 1}         // 第16字节第0位指示风扇存在状态(掩码1取最低位)
  },
  "Mapping": {
    "Scanner_Fan1_Presence": {
      "Value": "expr($fan1_prsnt_n)"   // 直接取硬件信号值(1表示存在,0表示不存在)
    },
    "Scanner_McuVersion": {
      "Value": "expr(($mcu_ver_major << 8) | $mcu_ver_minor)"  // 组合高低字节为16位版本号
    &#125;
  },
  "Context": &#123;
    "hw_version": "CLU_2.1"           // 硬件版本标识,可用于表达式条件判断
  &#125;
}

说明:

  • expr()函数用于执行表达式计算,支持变量引用(如$mcu_ver_major)和位运算。
  • Context中的字段可作为全局变量在表达式中引用(如$hw_version)。

5. Scanner的两种更新机制

5.1 基于Period的独立扫描任务

  • 定义:每个Scanner配置独立的扫描周期(Period),系统为每个Scanner创建单独的扫描任务。
  • 特点
    • 每次扫描仅更新单个Scanner的值,硬件访问次数与Scanner数量成正比。
    • 资源占用较高(任务数量多,硬件交互频繁)。

5.2 批量扫描(通过SmcDfxInfo)

  • 定义:通过SmcDfxInfo配置将多个Scanner的信号批量读取,仅使用一个任务完成多Scanner的联合更新。
  • 核心优势
    • 通过单次硬件访问获取多字节数据,显著减少硬件交互次数。
    • 资源效率高(任务数量与SmcDfxInfo配置数量相关,而非Scanner总数)。

5.3 任务协同机制

当Scanner被包含在SmcDfxInfo的批量扫描配置中时,系统会自动执行以下流程:

6. Scanner使用须知

  1. Scanner的Value值的使用应当配合Status值使用,即只有Status为0时,Value才为从硬件获取的真实值。