有没有方法对某个CSR对象进行防抖

问题描述

例如:需要对某个器件的温度在超温时进行滤波防抖,但调速策略不需要防抖,两个功能引用了同一个属性,有没有办法对Event中的Reading值,或者ThresholdSensor中的Reading值进行防抖

答案内容由AI生成,仅供参考:

:white_check_mark: 总结

问题 解答
能否对 CSR 对象进行防抖? :white_check_mark: 可以,通过 ScannerDebounce 属性实现
能否只对告警用温度防抖,调速不用? :white_check_mark: 可以,通过 两个 Scanner 分别引用同一硬件,一个带防抖,一个不带
推荐的防抖类型? 温度信号推荐 MedianMidAvg
防抖配置位置? 必须在 Scanner 对象中配置,不能在 ThresholdSensor 或 Event 中直接配置

:pushpin: 最佳实践将防抖作为数据采集层(Scanner)的预处理机制,而不是在上层逻辑中处理,以实现模块化、灵活控制。

点击此处查看详细分析解答

对 CSR 对象进行防抖的实现方法

根据您提出的问题:“是否可以对某个 CSR 对象(如器件温度)进行防抖处理,尤其在温度超温告警时进行滤波防抖,同时不影响其他功能(如调速策略)引用同一属性”,以下结合知识库中的信息进行详细解答。


:white_check_mark: 有方法实现:通过 Debounce 配置在 Scanner 层级 实现选择性防抖

:bullseye: 核心结论

可以实现对温度传感器 Reading 值的防抖,而不影响其他模块(如调速策略)使用原始值或不同处理逻辑。关键是将 防抖控制点放在 Scanner 对象上,因为防抖机制本质上是对硬件读取值的预处理,而不是在 Event 或 ThresholdSensor 中处理。


:magnifying_glass_tilted_left: 实现原理与架构分析

1. 防抖机制的核心是 ScannerDebounce 属性

在 openUBMC 系统中,防抖(Debounce)是通过 Scanner 类的 Debounce 属性实现的,用于在将原始硬件数据写入资源树前进行滤波处理。

  • 文档依据(来自搜索结果4):

    “在通过硬件代理Scanner对象读取硬件数据的时候,可以通过debounce属性配置防抖对象”

  • KG 关系支持

    DebounceScanner Class:Debounce 是 Scanner 的一个属性,用于稳定信号读取。

这意味着:防抖发生在数据进入系统之前,只影响后续依赖该 Scanner 输出的模块。


2. 防抖策略支持多种类型,适用于不同场景

防抖类型 适用场景 是否适合温度信号
Median(中值滤波) 脉冲噪声、温度类信号 :white_check_mark: 推荐
MidAvg(均值滤波) 模拟量平滑处理 :white_check_mark: 适合温度
Cont(持续一致) 数字信号稳定判断 :warning: 不推荐,响应慢
ContBin(二值持续) 开关量、高低电平 :cross_mark: 不适用
None 无防抖 默认

:white_check_mark: 建议对温度传感器使用 MedianMidAvg 防抖策略


:puzzle_piece: 具体实现方案

:white_check_mark: 方案:为温度读取配置独立的 Scanner,并设置防抖,而调速策略使用另一路径或绕过防抖

步骤如下:

1. 为温度传感器配置专用的 Scanner 并启用防抖

Scanner_TempSensor:
  Chip: "#/LM75_TempChip"
  Offset: 0x00
  Size: 1
  Type: 0
  Period: 1000
  Debounce: "#/MedianDebounce_Temperature"  # 启用中值滤波防抖
  ScanEnabled: 1

2. 定义防抖对象(Median 策略)

{
  "MedianDebounce_Temperature": {
    "WindowSize": 5,
    "DefaultValue": 25
  }
}
  • WindowSize: 5 表示取最近5次读数的中值作为输出,有效消除毛刺。
  • DefaultValue: 25 是初始默认值,用于未满窗时输出。

3. ThresholdSensor 引用该 Scanner 的输出作为 Reading 源

ThresholdSensor_Temp:
  Reading: "<=/Scanner_TempSensor.Value"
  UpperNoncritical: 85
  UpperCritical: 95
  ...

:right_arrow: 此时,ThresholdSensor 使用的是 已经经过防抖处理的温度值,避免了因瞬时尖峰触发误告警。

4. 调速策略使用原始值或独立路径(可选)

如果调速策略需要更灵敏的响应(例如风扇需快速响应温度上升),可以通过以下方式绕过防抖:

  • 方式一:直接读取芯片原始值(绕过 Scanner)

    Scanner_FanControlTemp:
      Chip: "#/LM75_TempChip"
      Offset: 0x00
      Size: 1
      Type: 0
      Period: 500
      Debounce: "None"  # 不防抖,响应更快
      ScanEnabled: 1
    
  • 方式二:在调速策略中使用表达式或 Accessor 直接访问硬件

    若系统支持,可通过低延迟通道直接获取原始值,避免使用防抖后的资源树值。

:white_check_mark: 这样就实现了 同一温度源,两个用途:告警用防抖稳定值,调速用原始快响应值


:hammer_and_wrench: 配置建议与最佳实践

目标 建议做法
防止误告警 ThresholdSensor 的输入做 Median 防抖
保持调速响应性 调速策略使用 Debounce: None 的 Scanner
资源复用 可定义多个 Scanner 指向同一硬件地址,但不同防抖策略
性能优化 避免过大的 WindowSize(建议 3~10),防止延迟过高

:warning: 注意事项

  1. 防抖不能配置在 ThresholdSensor 或 Event 本身

    • KG 显示 Debounce 是 Scanner 的属性,非 ThresholdSensor 的直接属性。
    • Event 仅监听 Reading 值变化,不参与数据预处理。
  2. 防抖会引入延迟

    • 例如 Median 窗口为 5,需等待 5 次采样才能输出稳定值。
    • 高温保护类告警需权衡 稳定性响应速度
  3. 默认值合理性

    • DefaultValue 应设为合理温度(如 25°C),避免初始误判。

:white_check_mark: 总结

问题 解答
能否对 CSR 对象进行防抖? :white_check_mark: 可以,通过 ScannerDebounce 属性实现
能否只对告警用温度防抖,调速不用? :white_check_mark: 可以,通过 两个 Scanner 分别引用同一硬件,一个带防抖,一个不带
推荐的防抖类型? 温度信号推荐 MedianMidAvg
防抖配置位置? 必须在 Scanner 对象中配置,不能在 ThresholdSensor 或 Event 中直接配置

:pushpin: 最佳实践将防抖作为数据采集层(Scanner)的预处理机制,而不是在上层逻辑中处理,以实现模块化、灵活控制。


如有具体硬件型号或 CSR 代码片段,可进一步提供针对性配置建议。

相关链接:

  1. 网卡传感器温度值从资源树同步的场景下,网卡断电,传感器数据不会更新
  2. scanner的值与smc的读值不同
  3. 硬件监控防抖机制参考
  4. Event事件使能状态控制
  5. 告警配置机制介绍 | 文档中心 | openUBMC

温度属性在lua代码中由其他方法获取 ,非 i2c获取

有的,详细可以参考这篇文档。

文档中提示不允许对 引用属性进行防抖 ,使用这种方法对ThresholdSensor中的Reading值进行防抖不会出问题吗

可以考虑在同步源进行防抖处理

代码中也能防抖,示例:

local debounce = require 'mc.debounce.debounce'
self.midavg = debounce[debounce.DEBOUNCED_MIDAVG].new(4, 20)
local temp = self.midavg:get_debounced_val(info.temperature)

如还有问题请尽快反馈,若问题解决请标记解决方案。