Scanner详解及数据更新机制
更新时间:2025/10/15
在Gitcode上查看源码Scanner详解及数据更新机制
1. Scanner概述
Scanner是南向硬件访问框架的核心机制,负责从指定硬件芯片读取实时数据。所有已配置的Scanner由硬件代理(hwproxy)按照预设周期轮询扫描,将采集到的值更新到系统资源树供上层应用使用。
2. Scanner核心属性说明
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| Chip | ro | 关联的硬件芯片对象 | - |
| ScanEnabled | U8 | 扫描使能状态0: 禁用 1: 启用 | 1 |
| Status | U8 | 当前扫描状态0: 正常 1: 失败 2: 防抖中 3: 禁用状态 4: 未初始化 | 4 |
| Value | U64 | 实际读取到的实时值 | - |
| NominalValue | U64 | 备用默认值(禁用时使用) | - |
| Period | U32 | 扫描周期(单位:毫秒) 强制最小值为100 | 3000 |
| FailureDebounceCount | U8 | 失败防抖阈值(连续失败次数超过此值触发失败状态) | 10 |
| SuccessDebounceCount | U8 | 恢复防抖阈值(连续成功次数超过此值恢复正常状态) | 10 |
3. 数据更新机制
3.1 基本流程
- 周期扫描:硬件代理按
Period周期轮询所有启用的Scanner(ScanEnabled=1)。 - 数据采集:
- 成功时:更新
Value为实际值,Status=0。 - 失败时:触发防抖逻辑,连续失败超过
FailureDebounceCount则Status=1。
- 成功时:更新
- 状态维护:
- 防抖状态(
Status=2):连续失败未达阈值时的中间状态。 - 禁用状态(
Status=3):当ScanEnabled=0时自动进入。
- 防抖状态(
- 备用值使用:
- 当
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位版本号
}
},
"Context": {
"hw_version": "CLU_2.1" // 硬件版本标识,可用于表达式条件判断
}
}说明:
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使用须知
- Scanner的Value值的使用应当配合Status值使用,即只有Status为0时,Value才为从硬件获取的真实值。